如何在嵌套表单之外的嵌套表单中使用字段作为“全局字段”?

时间:2011-10-16 12:52:43

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

如果我的模型具有以下关联:

class Business
has_many :products

class Product
belongs_to :business

我在控制器中生成了3个产品:

def new
  @business = Business.new
  3.times do
    @business.products.build
  end
end

让我的表单看起来像这样:

<%= form_for @business do |f| %>
    <% f.text_field :business_name %>
<%= f.fields_for :products do |pf| %> # x2 more products generated
    <% pf.text_field :name %>
    <% pf.text_field :price %>
    <% pf.text_field :date %>
<% end %>

如果我希望其中一个字段充当其他产品的全局字段,我怎样才能使用:price这样的字段并将其放在f.fields_for :products之外的字段中所有产品的:price

谢谢。

1 个答案:

答案 0 :(得分:3)

如果您需要初始化价格,请在控制器中执行此操作。但是,如果您需要一个不直接映射到模型的字段,请使用常规表单助手:

<%= text_field_tag 'global_price' %>

然后在创建操作的控制器中,它可用作

params[:global_price]

或者,您可以在商业模式中定义一种方法:

def global_price=
  #do something with the global price, such as updating child object...
  # I'm not sure if the child form objects have been instantiated yet though
end

然后您可以在商家表单中使用它:

<%= f.text_field :global_price %>

如果需要更新子对象,则可能需要在以后执行此操作;而不是那个方法,让它

attr_accessor :global_price

这使它成为一个实例变量。然后,您可以使用before_save过滤器来更新子对象。

before_save :update_global_price

def update_global_price
 #do something with @global_price
end