我正在尝试在Rails中构建表单构建器,为disabled
和text_field
助手添加select
属性。这是我的代码的简化版本:
class LabelFormBuilder < ActionView::Helpers::FormBuilder
%w[text_field select].each do |method_name|
define_method(method_name) do |name, *args|
super(name, :disabled => true, *args)
end
end
end
使用text_fields
,该属性会被正确添加,但selects
的内容会变得有点棘手,而且我会一直收到undefined method merge for #<Array:0x10b5229a0>
个错误。
这是我的观看代码(再次简化):
<%= f.label :name %>
<%= f.text_field :name %> # works!
<%= f.label :person %>
<%= f.select(:person_id, current_user.person_names, :prompt => 'Please select...') %> # does not work!
我如何才能获得上述课程的第4行来处理select
助手?
感谢您的帮助!
答案 0 :(得分:2)
select
的{{1}}定义为 here ,并带有以下方法签名
ActionView::Helpers::FormBuilder
使用以下方法签名<{1>} def select(method, choices, options = {}, html_options = {})
定义(动态) here
text_field
这是一个问题;您的代码正在传递ActionView::Helpers::FormBuilder
作为def text_field(method, options = {})
参数,这不是Rails所期望的。
我看到的另一个问题与我对你的意图的混淆有关。
{ disabled: true }
因为您在重载方法中choices
明确super(name, :disabled => true, *args)
,忽略从您的视图传入的任何选项。
我认为最简单的方法是独立地重载每个方法。
options
请注意{ disabled: true }
的使用。这是class LabelFormBuilder < ActionView::Helpers::FormBuilder
def text_field(method, options={})
options.reverse_merge! disabled: true
super(method, options)
end
def select(method, choices, options = {}, html_options = {})
html_options.reverse_merge! disabled: true
super(method, choices, options = {}, html_options = {})
end
end
上的Rails方法,允许您为哈希项提供默认值(例如上面所做的默认选项)。这允许将其他选项传递给您正在重载的方法,同时为reverse_merge!
提供合理的默认值,但仍然允许根据具体情况重写(您将直接传递{{1转到Hash
或:disabled
来电)。
这是未经测试的,但应该让你接近你所追求的目标。