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

时间:2014-03-28 11:38:14

标签: 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

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

<%= form_for @object, :builder => ApplicationHelper::AppFormBuilder do |f| %>
...
<% end %>

听起来理论上可以在全局范围内更改默认表单构建器(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

当我点击具有表单的视图时,会导致错误未定义的方法'new'用于“ApplicationHelper :: AppFormBuilder”:String

如果我改为尝试这个

config.action_view.default_form_builder = ApplicationHelper::AppFormBuilder

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

任何人都可以就如何使其发挥作用提供指导吗?

5 个答案:

答案 0 :(得分:14)

official docs中所述,在 Rails 5 中,正确的方法是在控制器中指定它。要使其适用范围广,请在ApplicationController

中进行设置
class ApplicationController < ActionController::Base
  default_form_builder AppFormBuilder
end

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

答案 1 :(得分:3)

在application.rb加载时,还不需要

ApplicationHelper::AppFormBuilder。您可以尝试将其放在单独的初始化文件中(在config \ initializers中创建一个):

module Web
  class Application
    ActionView::Base.default_form_builder = AppFormBuilder
  end
end

答案 2 :(得分:3)

我喜欢Max的答案,但是(这里有轨道n00b这么YMMV)我相信这是等同的,更清晰,直接在config / application.rb中:

config.after_initialize do
  ActionView::Base.default_form_builder = MyCustomHelper::MyCustomFormBuilder
end

显然你替换名称MyCustomHelper和MyCustomFormBuilder。

花了我大约48小时来解决这个问题,这要归功于所有结构良好的rails文档。

答案 3 :(得分:1)

您应该可以像使用其他配置选项一样从初始化程序设置此项。在default_form_builder.rb下创建config/initializers/文件。语法应该比@ Max的答案简单。

Rails.application.config.action_view.default_form_builder = AppFormBuilder

我建议你不要把它包含在帮手中。将其添加为/lib目录中的单独类。您可能需要也可能不需要使用其中包含的模块作为前缀。

最后,来自config/application.rb的{​​{3}},但您必须将其作为字符串传递,因为当rails启动时可能无法加载该类。

config.action_view.default_form_builder = 'AppFormBuilder'

答案 4 :(得分:0)

Rails 5+

class ApplicationController < ActionController::Base
  default_form_builder AppFormBuilder
end

Rails 4

class ApplicationController < ActionController::Base
  ActionView::Base.default_form_builder = AppFormBuilder
end

...或者如果您更喜欢初始化程序,我建议将其设置为字符串,这样您每次在表单构建器中更改内容时都不必重新启动Rails。(自上课以来)在rails启动时可能无法加载。https://stackoverflow.com/a/27992240/2037928

module Web
  class Application
    ActionView::Base.default_form_builder = "AppFormBuilder"
  end
end