Попытка расширить ActionView :: Helpers :: FormBuilder - PullRequest
2 голосов
/ 19 марта 2010

Я пытаюсь высушить код, переместив логику в FormBuilder. После прочтения документации о том, как выбрать и альтернативный конструктор форм, мне показалось, что логическое решение выглядит примерно так:

В представлении

<% 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

Где я делаю это неправильно?

Ответы [ 3 ]

5 голосов
/ 19 марта 2010

попробуйте с:

form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f|
4 голосов
/ 02 марта 2012

Как вы можете видеть в http://guides.rubyonrails.org/configuring.html#configuring-action-view,, вы можете установить класс FormBuilder по умолчанию для всего приложения. В вашем случае:

config.action_view.default_form_builder = "ApplicationHelper::TestFormBuilder"
4 голосов
/ 01 июля 2011

Класс 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 )
...