这是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"
。任何人都可以帮忙解释一下吗?
答案 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 %>