我的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 %>
最终会产生一个如下形式:
我尝试将f.fields_for :skills
更改为f.fields_for category.skills.last
(因为category.skills
中的最后一个对象是在控制器中创建的新技能),这会产生一个空白文本框,看起来像我需要的东西:
但是当我提交表单时,我得到一个“ param not found:category ”错误(指向我的类别控制器中的params.require(:category)...行。< / p>
如果我使用:skills
的符号但是在使用category.skills.last
(甚至是category.skills.each
时不起作用)我不确定表单的原因是什么 - 我得到了不同的错误当我这样做时:枚举器的未定义方法`model_name':Class )。
我做错了什么?
答案 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