如何在Ruby on Rails中向表单添加类,而不设置/覆盖现有的默认辅助类?

14

通过 html: {class: "form-horizontal"} 选项为 form_for 添加一个类可以覆盖默认的 new_modeledit_model 类。如何在保留现有的 form_helper 类的同时添加自己的类?

我想要的结果是:

<form class="edit_model form-horizontal">

<form class="new_model form-horizontal">

而不是:

<form class="form-horizontal">

6个回答

8
我遇到了完全相同的问题。最终,我想出了这个解决方案。
form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"}

这可能有点晚了,对你可能没有太大用处,但也许其他人会发现它有用。

这种方法并不总是有效的/在某些情况下可能会产生不同的结果。例如,当我为我的嵌入在主页上的Devise注册表单执行此操作时,它从new_user更改为index_user。 - Richard

4
通过:html => {:class => '...'}选项定义类会覆盖默认构建器添加的任何类。但是,您可以在块中附加CSS类而不覆盖这些类。
使用form_for助手,如果没有其他设置,则:class将为字符串。请注意追加时的前导空格。(更新:还要注意,在最近的Rails版本中,该字符串将被冻结,因此必须使用+=而不是<<以避免“无法修改冻结的字符串”错误。)
<%= form_for @model do |f| %>
  <% f.options[:html][:class] += ' form-horizontal' %>
  <%# ... %>
<% end %>

<form class="edit_model form-horizontal">

如果您使用simple_form_for辅助工具,则options[:html][:class]将是一个数组,您不需要额外的前导空格(尽管这不会有害)。
<%= simple_form_for @model do |f| %>
  <% f.options[:html][:class] << 'form-horizontal' %>
  <%# ... %>
<% end %>

<form class="simple_form edit_model form-horizontal">

如果您使用符号而不是模型,则form_for将不会设置类,块中的options[:html][:class]将为nil。 但是,如果您这样做,您没有一个要新建或持久化的模型。
<%= form_for :model do |f| %>
  <% f.options[:html][:class] << ' form-horizontal' %>
  <%# ... %>
<% end %>

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

1
你可以使用视图助手dom_class(object, prefix = nil)来生成类名,就像form_for一样。
直接在表单中这样做并不是很干净,但将其合并到助手中可能是最好的选择。例如:
# 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" ...>

1
也许不是最理想的解决方案,但您考虑过使用JS / JQuery吗?
例如:
$(document).ready(function(){
    $('form.edit_model').addClass('form-horizontal')
});

0

你尝试使用合并(merge)方法了吗?[http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge] 类似 html = html.merge(new) { |key, value1, value2| value1 + " " + value2 } 这样的方法可以让你将新值输入到类值中。【快速编辑:请小心配置和测试实现,以免完全覆盖 HTML】


0
html: {class: "edit_model form-horizontal"}

2
表单构建器的美妙之处在于它自动在edit_model和new_model类之间切换。我希望有一种优雅的方式来实现这一点,而不必将对象放入检测它是否为新对象的if语句中。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接