创建属于另一个资源的资源

时间:2013-08-21 21:56:52

标签: ruby-on-rails database model controller

以下是我的相关模型:

class ListItem < ActiveRecord::Base
    belongs_to  :inventory_item
    belongs_to  :shopping_list
    belongs_to  :item
end

class ShoppingList < ActiveRecord::Base
    has_many :list_items
    belongs_to  :user, :foreign_key => :user_id
end

class InventoryItem < ActiveRecord::Base

    belongs_to  :item, :foreign_key => :item_id
    belongs_to  :vendor
    has_many    :list_items
end

我想要一个按钮来创建属于他们拥有的用户指定列表的ListItems。新的ListItem也需要通过相应的:item_id:inventory_item_id。这是我当前观点的相关部分:

<tr>
        <% item.inventory_items.each do |product| %>
        <td><%= button_to "#{product.price}",
                           {:controller => :list_items,
                            :action => 'create',
                            :id => #what goes here??,
                            :method => :create %></td>
        <% end %>
</tr>

我的ListItems控制器创建方法:

def create
        ListItem.create
        flash[:success] = "List Item Added."
        redirect_to search_results_path(params[:search])
end

显然,我的create方法现在并不是那么有用,因为它只是创建了一个ListItem而没有:id以外的属性。将适当的参数传递给控制器​​的最佳方法是什么?任何帮助深表感谢!提前谢谢。

1 个答案:

答案 0 :(得分:0)

在围绕SO等进行一堆窥探后,我认为实现此目的的最佳方法是使用带有隐藏字段的表单,如下所示:

<%= form_tag("/list_items", method: "post") do %>
<%= hidden_field_tag(:item_id, item.id) %>
<%= hidden_field_tag(:inventory_item_id, product.id) %> 
<%= hidden_field_tag(:shopping_list_id, ShoppingList.first.id) %>
<%= submit_tag("#{product.price}") %>

这对我来说效果很好,在这个例子中比使用button_to更干净。