【问题标题】:Trying to extend ActionView::Helpers::FormBuilder试图扩展 ActionView::Helpers::FormBuilder
【发布时间】:2011-01-29 08:26:30
【问题描述】:

我试图通过将一些逻辑移动到 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

我哪里做错了?

【问题讨论】:

    标签: ruby-on-rails actionview formbuilder


    【解决方案1】:

    尝试:

    form_for @event, :builder => ApplicationHelper::TestFormBuilder do |f|
    

    【讨论】:

    • 谢谢。那行得通。这是记录在某处还是我错过了rails结构中的某些内容?
    • 你需要定义一个类。所以你不需要把它放在你的 ApplicationHelper 中。所以你可以把你的类放在你的库中并在没有命名空间的情况下使用。
    • 还有比这更优雅的方法吗?
    【解决方案2】:

    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 )
    

    【讨论】:

      【解决方案3】:

      正如您在http://guides.rubyonrails.org/configuring.html#configuring-action-view 中看到的,您可以为整个应用程序设置一个默认的FormBuilder-类。在你的情况下:

      config.action_view.default_form_builder = "ApplicationHelper::TestFormBuilder"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-08
        • 2012-05-21
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多