Ruby on Rails - 想要在通过 jquery-ui-sortable 排序时对嵌套属性进行排序
Ruby on Rails - Want to sort the nested attributes when sorting through jquery-ui-sortable
在我的 rails 应用程序中,我有嵌套属性。我正在使用 jquery-ui-sortable
对嵌套字段集进行排序。
在提交表单时,我想保持排序顺序,并在以编辑模式打开时在此显示字段集。我想保存数据库中每个嵌套字段集的排序位置。
我尝试了 acts_as_list
gem,但无法正常工作。我目前正在使用以下逻辑并且工作正常。
我想知道这个逻辑对不对。请就此提出您的建议。提前感谢您的回复。
逻辑是:
- 每个字段集都有一个 table 列
position
并且有
default_scope { order("position ASC") }
在我的模型中
- 提交表单时,控制器获取原始参数。在更新之前,我为每个字段设置
position
并将其用于进一步处理
我得到以下原始参数:
{
"utf8" => "✓", "_method" => "put", "job" => {
"name" => "my another test",
"fields_attributes" => {
"1" => {
"field_value" => "Id",
"field_id" => "1",
"_destroy" => "false",
"id" => "9"
},
"0" => {
"field_value" => "Name",
"field_id" => "2",
"_destroy" => "false",
"id" => "10"
}
},
"include_header" => "1"
}, "search" => "", "controller" => "jobs", "action" => "update", "id" => "4"
}
permitted: false
我的控制器代码是:
before_action :set_position, only: :update
def update
@job = Job.where(id: params[:id]).first
if @job.update_attributes(job_params)
redirect_to jobs_url
end
end
def set_position
index = 1
params[:job][:fields_attributes].each do |f, params|
params[:position] = index
index += 1
end
end
def data_job_params
params.require(:job).permit(:name, :user_id, :include_header, fields_attributes: %i(id field_value field_id position _destroy))
end
它工作正常,但我想知道我是否以正确的方式执行此操作。
这里有一些东西可能会派上用场:
首先,您可以使用 each_with_index
遍历 params[:job][:fields_attributes]
- 类似于:
def set_position
params[:job][:fields_attributes].each_with_index do |(f, fieldset_params), i|
fieldset_params[:position] = index + 1 # << index starts at 0
end
end
您还会注意到 params[:job][:fields_attributes]
中每个对象的键实际上是散列中对象的编号,因此,如果您对此感到满意,您可以 使用那个:
def set_position
params[:job][:fields_attributes].each do |f, fieldset_params|
fieldset_params[:position] = f
end
end
您会注意到我在这两个示例中都将 params
更改为 fieldset_params
- 它通过不隐藏外部变量来避免一些混乱/潜在的错误。
您还可以在 position
的视图代码中有一个隐藏字段,从 1 开始。如果您编辑问题以包含视图代码,我可以告诉您如何操作。
希望里面的东西能帮到你 - 让我知道你过得怎么样!
在我的 rails 应用程序中,我有嵌套属性。我正在使用 jquery-ui-sortable
对嵌套字段集进行排序。
在提交表单时,我想保持排序顺序,并在以编辑模式打开时在此显示字段集。我想保存数据库中每个嵌套字段集的排序位置。
我尝试了 acts_as_list
gem,但无法正常工作。我目前正在使用以下逻辑并且工作正常。
我想知道这个逻辑对不对。请就此提出您的建议。提前感谢您的回复。
逻辑是:
- 每个字段集都有一个 table 列
position
并且有default_scope { order("position ASC") }
在我的模型中 - 提交表单时,控制器获取原始参数。在更新之前,我为每个字段设置
position
并将其用于进一步处理
我得到以下原始参数:
{
"utf8" => "✓", "_method" => "put", "job" => {
"name" => "my another test",
"fields_attributes" => {
"1" => {
"field_value" => "Id",
"field_id" => "1",
"_destroy" => "false",
"id" => "9"
},
"0" => {
"field_value" => "Name",
"field_id" => "2",
"_destroy" => "false",
"id" => "10"
}
},
"include_header" => "1"
}, "search" => "", "controller" => "jobs", "action" => "update", "id" => "4"
}
permitted: false
我的控制器代码是:
before_action :set_position, only: :update
def update
@job = Job.where(id: params[:id]).first
if @job.update_attributes(job_params)
redirect_to jobs_url
end
end
def set_position
index = 1
params[:job][:fields_attributes].each do |f, params|
params[:position] = index
index += 1
end
end
def data_job_params
params.require(:job).permit(:name, :user_id, :include_header, fields_attributes: %i(id field_value field_id position _destroy))
end
它工作正常,但我想知道我是否以正确的方式执行此操作。
这里有一些东西可能会派上用场:
首先,您可以使用 each_with_index
遍历 params[:job][:fields_attributes]
- 类似于:
def set_position
params[:job][:fields_attributes].each_with_index do |(f, fieldset_params), i|
fieldset_params[:position] = index + 1 # << index starts at 0
end
end
您还会注意到 params[:job][:fields_attributes]
中每个对象的键实际上是散列中对象的编号,因此,如果您对此感到满意,您可以 使用那个:
def set_position
params[:job][:fields_attributes].each do |f, fieldset_params|
fieldset_params[:position] = f
end
end
您会注意到我在这两个示例中都将 params
更改为 fieldset_params
- 它通过不隐藏外部变量来避免一些混乱/潜在的错误。
您还可以在 position
的视图代码中有一个隐藏字段,从 1 开始。如果您编辑问题以包含视图代码,我可以告诉您如何操作。
希望里面的东西能帮到你 - 让我知道你过得怎么样!