6

私は自分のサイトを Twitter Bootstrap 3 に変換していますが、ばかげたような問題に遭遇しましたが、Google 経由で簡単な解決策を見つけることができませんでした。

Railsフォームヘルパーでclass="form-control"をデフォルトで設定するにはどうすればよいですか? 明示的に入力することしかできません。これは時間の無駄のようです。(下)

入力のスタイルを設定するには、ブートストラップが必要です。

 <%= f.label :email %>                                     
 <%= f.text_field :email, class: "form-control" %>   

ブートストラップが実装したからといって、Rails がこの機能を追加すべきだと考えるのは単純すぎますか?

4

5 に答える 5

4

クラスをすべてのフォーム要素に追加するには、たとえそれらのフォーム要素が simple_form のような gem によって生成されたとしても、変更はApplicationController. 次のスニペットをイニシャライザに配置して、それを行うことができます。

require 'action_view/helpers/tags/base'
# Most input types need the form-control class on them.  This is the easiest way to get that into every form input
module BootstrapTag
  FORM_CONTROL_CLASS = 'form-control'
  def tag(name, options, *)
    options = add_bootstrap_class_to_options options, true if name.to_s == 'input'
    super
  end

  private

  def content_tag_string(name, content, options, *)
    options = add_bootstrap_class_to_options options if name.to_s.in? %w(select textarea)
    super
  end

  def add_bootstrap_class_to_options(options, check_type = false)
    options = {} if options.nil?
    options.stringify_keys!
    if !check_type || options['type'].to_s.in?(%w(text password number email))
      options['class'] = [] unless options.has_key? 'class'
      options['class'] << FORM_CONTROL_CLASS if options['class'].is_a?(Array) && !options['class'].include?(FORM_CONTROL_CLASS)
      options['class'] << " #{FORM_CONTROL_CLASS}" if options['class'].is_a?(String) && options['class'] !~ /\b#{FORM_CONTROL_CLASS}\b/
    end
    options
  end
end

ActionView::Helpers::Tags::Base.send :include, BootstrapTag
ActionView::Base.send :include, BootstrapTag
于 2013-11-21T20:30:02.623 に答える
1

はい、時間の無駄です。

Bootstrap とうまく統合するsimple_form gemを使用します。これらを記述する必要はなくなりました。

バンドル後、実行するだけ

rails generate simple_form:install --bootstrap

次に、simple_form 初期化子が追加されます。デフォルトで十分ですが、initializers/simple_form_bootstrap でさらにカスタマイズできます。

これらのヘルパー クラスはすべて、他の多くの優れた機能と同様に自動的に生成されます。

于 2013-09-17T03:57:13.107 に答える
1

次のような Bootstrap 関連の Gem のいずれかを使用できます。

https://github.com/stouset/twitter_bootstrap_form_for

またはこれ:

https://github.com/sethvargo/bootstrap_forms

于 2013-09-17T03:58:48.857 に答える
0

前の 2 つの回答は、実際には非常にうまく機能します (独自のイニシャライザを使用する単純なフォーム、またはブートストラップ フォーム gems を使用する)。あらゆるコードと同様に、猫の皮を剥ぐ方法はたくさんあります。別の (より手動の) 方法は、独自のフォーム ヘルパーを追加することです。手順は基本的に次のとおりです。

  1. 次のようなヘルパー ファイルを作成します。app/helpers/custom_form_helper.rb
  2. フォーム ビルダー クラスから継承します。CustomFormBuilder < ActionView::Helpers::FormBuilder
  3. あなたが望む外観を作成します。

    def text_field(label, *args)
      options = args.extract_options!
      new_class = options[:class] || "form-control"
      super("dd", label, *(args << options.merge(:class => new_class)))
    end
    
  4. 次のように、フォームを呼び出すたびにヘルパーを含める必要がないように、アプリケーションでヘルパー メソッドを呼び出します。

    def custom_form_for(name, *args, &block)
      options = args.extract_options!
      content_tag("div",
      content_tag("dl", form_for(name, *(args << options.merge(:builder => CustomFormBuilder)), &block)), :class => "standard_form")
    end
    
  5. フォームでカスタム フォームを次のように使用します。custom_form_for

于 2013-09-17T04:32:45.583 に答える