我已经对默认表单构建器进行了子类分类以添加一些其他方法。示例代码如下。
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 *。
任何人都可以就如何使其发挥作用提供指导吗?
答案 0 :(得分:14)
如official docs中所述,在 Rails 5 中,正确的方法是在控制器中指定它。要使其适用范围广,请在ApplicationController
:
class ApplicationController < ActionController::Base
default_form_builder AppFormBuilder
end
这更有意义。 FormHelpers是视图层的一部分,而不是应用程序配置。
答案 1 :(得分:3)
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