Rails 'grouped_options_for_select' 编辑无效

Rails 'grouped_options_for_select' edit not working

我的模型

Class Person
   belongs_to :job, class: "Job"
end

 Class Job
    has_ancestry orphan_strategy: :adopt
end

在我看来

= form.select(:job_id, Job.all.map { |job| [job.name.titleize, job.id] }, {prompt: 'Job'}, {:class => 'form-control'})

当我在没有 grouped_options_for_select 的情况下使用时,它工作正常。我在更新记录时获取数据。但是我的 select 选项没有正确列出

= form.select :job_id, grouped_options_for_select(Job.roots.map { |parent| [parent.name, parent.children.map { |c| [c.name, c.id]}] }), {prompt: 'Select'}, {class: "form-control"}

但是当我用这个'grouped_options_for_select'更新记录的时候。作业 ID 没有出现在我的 select 选项中

 output 
     Parent1
         child1 <----this is in the select option
         child2 <----this is in the select option
     Parent2
        child1 <----this is in the select option
        child2 <----this is in the select option

例如,我要编辑一份有 Parent2<

当我加载作业记录时,我的 select 没有获得正确的记录。

select 框总是获得第一个 select 选项

检查您的型号。对吗?

Job.roots.map { |parent| [parent.name, parent.children.map { |c| [c.name, c.id]}] }

[
    ["Teacher", [["Physics", 2], ["Math", 3]]], 
    ["programmer", [["junior", 5], ["senior", 6]]]
]

但我认为 select 的选项不需要 Person。

它是带有 select 框的表单的片段。

<%= form_for :form do |f| %>
  <%= f.select(
      "job_id",
      grouped_options_for_select(
        Job.roots.map { |parent| [
          parent.name,
          parent.children.map { |child| [child.id, child.name] }
        ] }
      ),
      {prompt: "Select"},
      {class: "form-control"}
      )
  %>
<% end %>

你想要的是select,对吧?

<select name="form[job_id]" id="form_job_id">
    <option value="">Select</option>
    <optgroup label="Teacher">
        <option value="2">Physics</option>
        <option value="3">Math</option>
    </optgroup>
    <optgroup label="programmer">
        <option value="5">junior</option>
        <option value="6">senior</option>
    </optgroup>
</select>

更新答案

当你第一次 select 'Physics' 选项时

  grouped_options_for_select(
    Job.roots.map { |parent| [
      parent.name,
      parent.children.map { |child| [child.id, child.name] }
    ] },
    2  <-- add selected_params value by N
  )

参考 grouped_options_for_select

  • 没有grouped_options_for_select

您在这里使用 Job.all 您显示的是所有职位,即 parentschildern

  • 和grouped_options_for_select

你在这里使用 Job.roots 然后 parent.children 基本上你只显示 `childern.

为了同时显示 parentchildren 以及正确的列表,您必须在 grouped_options_for_select 第二个参数中添加父数组。

= form.select :job_id, 
  grouped_options_for_select(
    Job.roots.map { |parent| 
      [
        parent.name, 
        [parent.name, parent.id] + parent.children.map { |c| [c.name, c.id]}
       ] 
     }
   ), 
   {prompt: 'Select'}, 
   {class: "form-control"}

注意:- 注意 [parent.name, parent.id] +