如何使用表单生成器在Rails中添加属性以形成帮助器?

时间:2012-11-04 23:54:53

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试在Rails中构建表单构建器,为disabledtext_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助手?

感谢您的帮助!

1 个答案:

答案 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来电)

这是未经测试的,但应该让你接近你所追求的目标。