目前我有三个模型,一个是User,有很多项目,还有Projects has_many Parts。我目前正在构建用户和部件之间的关系模型(Part_Item)。
简化型号:
class User
has_many :projects
has_many :part_items
end
class Project
belongs_to :user
has_many :parts, dependent: :destroy
accepts_nested_attributes_for :parts, :reject_if => lambda { |a| a[:name].blank? }, allow_destroy: true
end
class Part
belongs_to :project
has_many :part_items
end
class PartItem
belongs_to :user
belongs_to :part
end
在项目页面上,用户可以按下I Made It按钮,该按钮将创建用户和部件之间的关系。用户可以看到他已经使用过哪些部件。如果只有一个部分,我可以写下以下内容:
<%= form_for(current_user.part_items.build(part_id: @part.id), remote: true) do |f| %>
<div><%= f.hidden_field :part_id %></div>
<%= f.submit "I Made It", class: "btn btn-small btn-primary" %>
<% end %>
这不适用于许多部分,它们是项目的嵌套属性。
的问题 的: 1。如何获取表单中的零件项的哈希值?我试过了:
<%= @project.parts.each do |part| %>
<div><%= hidden_field_tag :part_id, part.id %></div>
<% end %>
但这只会抓住最后一个part_id。
2. 我应该在PartItem控制器中使用create方法吗?如何在PartItem控制器中设置我的操作的任何建议/方向将不胜感激。目前我只有:
def create
@part = Part.find(params[:part_id])
current_user.save_part!(@part)
redirect_to root_url
end
用于保存一个部件,但不能用于保存多个部件。
答案 0 :(得分:0)
原来我正在考虑这种错误的方式,一个良好的夜晚睡眠清除了一切。
我想要一个按钮,通过“项目”页面上的按钮在用户和部件之间建立关系。我的第一个想法是制作一个表格,将所有part.id收集到一个哈希并提交给控制器,我将它们分开,个人保存关系。
我的解决方案:
部件是项目的嵌套属性。所以我做了一个表单来将project.id提交给控制器。然后我可以从嵌套属性关系中获取所有部分并创建新关系。所以现在我的表格看起来像这样:
<%= form_for([current_user.part_items.build]) do |f| %>
<div><%= hidden_field_tag :project_id, @project.id %></div>
<%= f.submit "I Made This!", class: "btn btn-large btn-primary" %>
<% end %>
控制器创建动作如下所示:
def create
@project = Project.find(params[:project_id])
@project.parts.each do |part|
@part = part.id
current_user.save_part!(part)
end
end
现在一切正常。