Spree的field_container方法中的参数数量

时间:2015-05-18 02:41:58

标签: ruby-on-rails spree

这是Spree中field_container的方法定义:

# File 'app/helpers/spree/admin/base_helper.rb', line 4

def field_container(model, method, options = {}, &block)
  css_classes = options[:class].to_a
  css_classes << 'field'
  if error_message_on(model, method).present?
    css_classes << 'withError'
  end
  content_tag(:div, capture(&block), :class => css_classes.join(' '), :id => "#{model}_#{method}_field")
end

但在使用中似乎只需要method。例如。

<%= f.field_container :sale_price do %>
  <%= f.label :sale_price, raw(Spree.t(:sale_price) + content_tag(:span, ' *')) %>
  <%= f.text_field :sale_price, :value =>
    number_to_currency(@product.sale_price, :unit => '') %>
  <%= f.error_message_on :sale_price %>
<% end %>

上述代码生成的div将自动拥有id="product_sale_price_field"。任何人都可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:2)

使用f.field_container是指在声明的类ActionView::Helpers::FormBuilder中的表单助手方法 {path_to_spree_backend_gem}/config/initializers/form_builder.rb 这个方法的内容是

def field_container(method, options = {}, &block)
  @template.field_container(@object_name,method,options,&block)
end

请注意f是打开

的括号对象
<%= form_for @someobj do |f|%>
   ...
<% end %>

所以它在你提到的方法中调用不同范围的不同方法,f调用者保存对象细节,所以在你的情况下,使用

<%= f.field_container :sale_price do %>
  ..
<% end %>

和做

一样
<%= field_container @product, :sale_price do %>
  ..
<% end %>