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,但无法正常工作。我目前正在使用以下逻辑并且工作正常。

我想知道这个逻辑对不对。请就此提出您的建议。提前感谢您的回复。

逻辑是:

  1. 每个字段集都有一个 table 列 position 并且有 default_scope { order("position ASC") } 在我的模型中
  2. 提交表单时,控制器获取原始参数。在更新之前,我为每个字段设置 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 开始。如果您编辑问题以包含视图代码,我可以告诉您如何操作。

希望里面的东西能帮到你 - 让我知道你过得怎么样!