rails 4,全局更改默认表单构建器

Mik*_*ike 7 ruby-on-rails ruby-on-rails-4

我已经对默认表单构建器进行了分类,以添加一些其他方法.示例代码如下.

module ApplicationHelper
    class AppFormBuilder < ActionView::Helpers::FormBuilder
        def coordinates_field(method, options = {})
            options[:readonly] = 'true'
            ....
            @template.text_field(@object_name, method, objectify_options(options))
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

这很好用,但要使用它我必须更改使用该coordinates_field方法的每个表单的视图代码,即

<%= form_for @object, :builder => ApplicationHelper::AppFormBuilder do |f| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)

听起来理论上可以在全局(config.action_view.default_form_builder)中更改默认表单构建器,但我似乎无法使其工作.这是我尝试过的/config/application.rb:

module Web
  class Application < Rails::Application
    ...
    config.action_view.default_form_builder = "ApplicationHelper::AppFormBuilder"
  end
end
Run Code Online (Sandbox Code Playgroud)

这导致错误未定义方法'new'用于"ApplicationHelper :: AppFormBuilder":当我点击具有表单的视图时的字符串.

如果我反而尝试这个

config.action_view.default_form_builder = ApplicationHelper::AppFormBuilder
Run Code Online (Sandbox Code Playgroud)

应用程序启动时出现错误*config.action_view.default_form_builder = ApplicationHelper :: AppFormBuilder*.

任何人都可以提供有关如何使其工作的指导?

ved*_*ant 14

正如官方文档中所提到的,在Rails 5中,正确的方法是在控制器中指定它.要使其适用于应用程序,只需在您的ApplicationController:

class ApplicationController < ActionController::Base
  default_form_builder AppFormBuilder
end
Run Code Online (Sandbox Code Playgroud)

这更有意义.FormHelpers是视图层的一部分,而不是应用程序配置.


Max*_*akh 3

ApplicationHelper::AppFormBuilderapplication.rb 加载时还不需要。您可以尝试将其放入单独的初始化程序文件中(在 config\initializers 中创建一个):

module Web
  class Application
    ActionView::Base.default_form_builder = AppFormBuilder
  end
end
Run Code Online (Sandbox Code Playgroud)