如何在Rails中为嵌套属性传递参数?

时间:2013-04-28 23:36:02

标签: ruby-on-rails ruby ruby-on-rails-3 nested-attributes

我有两种型号,原料和食品:

class Food < ActiveRecord::Base

    belongs_to :user
    has_many :ingredients

    accepts_nested_attributes_for :ingredients

    attr_accessible :name, :price
end

class Ingredient < ActiveRecord::Base

    belongs_to :user
    belongs_to :food

    attr_accessible :ingredient_name, :quantity_used
end

两种模型的模式如下:

  create_table "foods", :force => true do |t|
    t.string  "name"
    t.integer "user_id"
    t.float   "price"
    t.string  "ingredient_name"
  end

  create_table "ingredients", :force => true do |t|
    t.string  "ingredient_name"
    t.integer "user_id"
    t.integer "food_id"
    t.integer "quantity_used"
  end

我正在为Food创建一个表单,它也会创建/更新Ingredient表。我有表单工作,并且提交按钮更新了正确的属性,但我还想在每个表中更新其他属性。例如,在食物控制器中,我想做ingredient.user_id = current_user.id之类的事情。我知道我可以通过params [:food]访问内容,但是如何访问不是表单更新的单个字段?

现在,我的表格是:

<%= form_for(@food) do |f| %>
  <div class="field">
    <%= f.label :Name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :price %><br />
    <%= f.number_field :price %>
  </div>
    <div>
        <%= f.fields_for :ingredients do |builder| %>
        <%= builder.label "Ingredient Used:" %>
        <%= builder.text_field :ingredient_name %><br />
            <%= builder.label "Quantity Used:" %>
            <%= builder.text_field :quantity_used %><br />
        <% end %>
    </div>
    <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

如何在Food#create action中访问此特定食物的成分?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可能需要在食物模型中将:ingredients_attributes 添加到 attr_accessible

你可以通过遍历:ingredients_attributes 来控制控制器中的params哈希,或者你可以使用assign_attributes