【问题标题】:Ruby on Rails - Want to sort the nested attributes when sorting through jquery-ui-sortableRuby on Rails - 通过 jquery-ui-sortable 排序时想要对嵌套属性进行排序
【发布时间】:2017-11-24 12:59:15
【问题描述】:

在我的 rails 应用程序中,我有嵌套的属性。我正在使用jquery-ui-sortable 对嵌套字段集进行排序。

在提交表单时,我想保持排序顺序并在以编辑模式打开时显示字段集。我想保存数据库中设置的每个嵌套字段的排序位置。

我尝试了acts_as_list gem,但无法正常工作。我目前正在使用以下逻辑,它工作正常。

我想知道这个逻辑是否正确。请就它提出你的建议。感谢您提前回复。

逻辑是:

  1. 我对每个字段集都有一个表列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

它工作正常,但我想知道我是否以正确的方式这样做。

【问题讨论】:

    标签: ruby-on-rails jquery-ui-sortable nested-attributes


    【解决方案1】:

    这里有几件事可能会很方便:

    首先,您可以使用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 开始。如果您编辑问题以包含查看代码,我可以告诉您如何做到这一点。

    希望里面的东西能帮上忙——让我知道你的进展如何!

    【讨论】:

    • 感谢您的回复@SRack。在我的代码中更新。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2018-03-01
    相关资源
    最近更新 更多