3

We would like to use bootstrap span6 in our simple_form. Here is what we are doing now:

<%= simple_form_for(@customer, :html => {:class => 'form-horizontal'}) do |f| %>    

  <%= f.input :name, :label => t('CompanyName:'), :input_html => { :class => "span6" } %>  
  <%= f.button :submit, t('Save') , :class => BUTTONS_CLS['action'] %>  
<% end %> 

The problem is that we need add :input_html => {:class => 'span6'} to each and every f.input and there are quite a lot of simple_forms in our rails app. Is there a way we can assign once span6 and apply it to all simple form in the app? Or we have to go one by one to add the input_html => {} to each f.input.

4

2 回答 2

3

您可以将按钮、标签、输入等不同元素的默认类放在简单表单配置文件中 -> config/initializers/simple_form.rb

SimpleForm.setup do |config|
  config.form_class = :simple_form
  config.input_class = :input_class
end

有关更多配置选项,请参阅此示例文件

于 2013-08-30T04:39:02.770 回答
3

另一个答案config.input_class中提到的选项是在 2.1.0 发布后引入的。这就是你得到错误的原因。使用来自 Github 的最新 gem 版本可以解决这个问题,但是这个版本需要 Rails 4。

您可以通过将以下内容附加到以下内容来覆盖默认行为config/initializers/simple_form.rb

%w(StringInput RangeInput CollectionSelectInput GroupedCollectionSelectInput PasswordInput TextInput NumericInput).each do |class_name|
  old_class = "SimpleForm::Inputs::#{class_name}".constantize
  new_class = Class.new(old_class) do
    def input_html_classes
      super.push('span6')
    end
  end
  Object.const_set(class_name, new_class)
end

代码说明:我使用了一些元编程以避免编写几乎相同的代码七次。因此,此代码执行以下操作:

  1. 它遍历代表各种类型字段的类名称数组。
  2. 接下来,它使用String#constantizeActiveSupport 提供的方法通过其名称获取一个类。
  3. Class#new接下来,它使用(传递给的参数Class#new是祖先类)动态创建一个类,并input_html_classes在其中定义方法。
  4. 接下来,它为新创建的类分配一个名称。

最后,我们有七个类StringInputRangeInput等等,都有覆盖的input_html_classes方法。

于 2013-09-08T13:07:32.657 回答