如何使用fields_for:symbol加载字段 - 但只渲染符号引用的最终对象的表单字段?

时间:2013-11-06 13:59:34

标签: ruby-on-rails forms ruby-on-rails-4 simple-form

我的Category模型has_many Skills

我有一个页面,我希望用户能够通过文本框(只是skill的名称)向选定的category添加一个新的skill,同时列出categories页面上的所有内容以及skills中的categories

我目前可以显示包含categories的所有skills,但我不知道如何制作它,以便用户只能创建新的skill能够编辑skills belongs_to的所有其他category

以下是我目前的代码:

控制器:

def show
  . . .
  #needed for showing all categories
  @categories = current_user.categories
  #needed to show a blank skill when editing a category
  @skills = []
  @categories.each do |cat|
    @skills << cat.skills.build
  end
  . . .
end

查看:

<% @categories.each do |category| %> # I skip most of the code related to formatting
    <%= simple_form_for(category) do |f| %>
      <%= f.fields_for :skills do |s| %>
        <div class="inputs">
          <%= s.input :name %> 
          <%= s.hidden_field :category_id %>
          <%= s.hidden_field :id %>
        </div>
      <% end %>
          <%= f.button :submit %>
    <% end %>
<% end %>

最终会产生一个如下形式:

able to edit every skill

我尝试将f.fields_for :skills更改为f.fields_for category.skills.last(因为category.skills中的最后一个对象是在控制器中创建的新技能),这会产生一个空白文本框,看起来像我需要的东西:

Only renders the blank skill field, but cannot submit it

但是当我提交表单时,我得到一个“ param not found:category ”错误(指向我的类别控制器中的params.require(:category)...行。< / p>

如果我使用:skills的符号但是在使用category.skills.last(甚至是category.skills.each时不起作用)我不确定表单的原因是什么 - 我得到了不同的错误当我这样做时:枚举器的未定义方法`model_name':Class )。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

尝试这个 f.fields_for :skills, category.skills.last

:skills代表关系名称。 (category has many skills

category.skills.last表示要在表单中使用的对象。 e.g

f.fields_for :skills, category.skills.build do |s| .. end

f.fields_for :skills, category.skills.last(3) do |s| ... end