Form_for建立多种关系

时间:2014-01-09 17:17:43

标签: ruby-on-rails forms controller form-for

目前我有三个模型,一个是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

用于保存一个部件,但不能用于保存多个部件。

1 个答案:

答案 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

现在一切正常。