3

いくつかのロジックを FormBuilder に移動して、いくつかのコードを DRY しようとしています。フォームビルダーの選択方法と代替フォームビルダーに関するドキュメントを読んだ後、私にとっての論理的な解決策は次のように思えました。

ビューで

<% form_for @event, :builder => TestFormBuilder do |f| %>
    <%= f.test  %>
    <%= f.submit 'Update' %>
<% end %>

そして app/helpers/application_helper.rb に

module ApplicationHelper
    class TestFormBuilder < ActionView::Helpers::FormBuilder
        def test
            puts 'apa'
        end
    end
end

ただし、これにより、「form_for」でエラーが発生します

  uninitialized constant ActionView::Base::CompiledTemplates::TestFormBuilder

どこで間違っていますか?

4

3 に答える 3

5

で試してください:

form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f|
于 2010-03-19T08:00:44.307 に答える
4

http://guides.rubyonrails.org/configuring.html#configuring-action-viewでわかるように、アプリケーション全体にデフォルトのFormBuilderクラスを設定できます。あなたの場合:

config.action_view.default_form_builder = "ApplicationHelper::TestFormBuilder"
于 2012-03-02T13:47:11.353 に答える
4

Builder クラスは、次のように、モジュール定義の内側または外側のモジュール ファイルに配置できます。

    # app/helpers/events_helper.rb
    module EventsHelper
        ...
        class FormBuilderIn < ActionView::Helpers::FormBuilder
            ...
        end
    end
    class FormBuilderOut < ActionView::Helpers::FormBuilder
        ...
    end

ビルダーをフォームにアタッチする適切な方法は次のとおりです。

    # app/views/events/_form_in.html.erb
    form_for @event, :builder => EventsHelper::FormBuilderIn do |f|

    # app/views/events/_form_out.html.erb
    form_for @event, :builder => FormBuilderOut do |f|

フォームにビルダー オプションを設定するためのヘルパー メソッドを次に示します。

    # app/helpers/events_helper.rb
    module EventsHelper
      def form_in_for(data, *args, &proc)
          options = args.extract_options!
          form_for(data, *(args << options.merge(:builder => EventsHelper::FormBuilderIn)), &proc)
      end
      def form_out_for(data, *args, &proc)
          options = args.extract_options!
          form_for(data, *(args << options.merge(:builder => FormBuilderOut)), &proc)
      end
    end
    ...

現在、ビルダーをフォームにアタッチするオプションの方法があります。

    # app/views/events/_form_in.html.erb
    form_in_for @event do |f|

    # app/views/events/_form_out.html.erb
    form_out_for @event do |f|

最後に、カスタム ビルダーを別のフォルダー ("app/builders" など) に配置できますが、このパスをアプリケーション環境に手動で追加する必要があります。Rails 2.3.x の場合は、次のように設定します。

    # config/environment.rb.
    config.load_paths += %W( #{RAILS_ROOT}/app/builders )
于 2011-07-01T10:06:36.950 に答える