Ruby on rails 如何在RubyonRails中向表单添加类而不设置/重写现有的默认帮助器类?

Ruby on rails 如何在RubyonRails中向表单添加类而不设置/重写现有的默认帮助器类?,ruby-on-rails,ruby-on-rails-3,forms,form-for,Ruby On Rails,Ruby On Rails 3,Forms,Form For,通过html:{class:“form horizontal”}选项为form_添加类将覆盖默认的new_model或edit_model类。如何在保留现有form_helper类的同时添加类 我想: 或 而不是: 也许不是一个理想的解决方案,但您是否考虑过使用JS/Jquery 例如: $(document).ready(function(){ $('form.edit_model').addClass('form-horizontal') }); 我遇到了完全相同的问题。最终,我

通过
html:{class:“form horizontal”}
选项为
form_添加类将覆盖默认的
new_model
edit_model
类。如何在保留现有form_helper类的同时添加类

我想:

而不是:


也许不是一个理想的解决方案,但您是否考虑过使用JS/Jquery

例如:

$(document).ready(function(){
    $('form.edit_model').addClass('form-horizontal')
});

我遇到了完全相同的问题。最终,我想出了这个解决方案

form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"}

这对你来说可能有点太晚了,但也许其他人会发现它很有用

您是否尝试过使用合并方法?[类似html=html.merge(new){| key,value1,value2{124; value1+“”+value2}将允许您将新值输入到类值中。[快速编辑:小心配置和测试实现,以免完全覆盖html)

您可以使用视图助手
dom_类(对象,前缀=nil)
生成类名称,如
的表单_

直接在表单中进行操作不是很干净,但将其合并到助手中可能只是一张罚单。例如:

# app/helpers/application_helper.rb
def class_for object, *additional_classes
  additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new')
end

# app/views/models/_form.html.erb
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %>
  <%# ... %>
<% end %>

<form class="new_model form-horizontal" ...>
#app/helpers/application_helper.rb
对象的def class_,*其他_类
其他_类.unshift dom_类(对象,对象.persistend??“编辑”:“新建”)
结束
#app/views/models/_form.html.erb
{:class=>class_for(@model,'form horizontal')}do | f |%>

通过
:html=>{:class=>'…'}定义类
选项覆盖默认生成器添加的任何类。但是,您可以在块内附加CSS类,而不覆盖这些类


对于帮助程序的
表单_,
:class
如果没有另外设置,则将是一个字符串。追加时请注意前导空格。(更新:还请注意,在最新版本的Rails中,字符串将被冻结,因此必须使用
+=
而不是
。表单生成器的优点在于它可以自动在编辑模型和新模型类之间切换。我希望使用一种优雅的方法来实现这一点,而不必将对象放入if stat中检测是否为新对象的元素。此方法并不总是有效/在某些情况下会产生不同的结果。例如,当我为嵌入在主页中的Desive注册表单执行此操作时,它从新用户更改为索引用户。
# app/helpers/application_helper.rb
def class_for object, *additional_classes
  additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new')
end

# app/views/models/_form.html.erb
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %>
  <%# ... %>
<% end %>

<form class="new_model form-horizontal" ...>
<%= form_for @model do |f| %>
  <% f.options[:html][:class] += ' form-horizontal' %>
  <%# ... %>
<% end %>

<form class="edit_model form-horizontal">
<%= simple_form_for @model do |f| %>
  <% f.options[:html][:class] << 'form-horizontal' %>
  <%# ... %>
<% end %>

<form class="simple_form edit_model form-horizontal">
<%= form_for :model do |f| %>
  <% f.options[:html][:class] << ' form-horizontal' %>
  <%# ... %>
<% end %>

NoMethodError: undefined method `<<' for nil:NilClass