更改模型的输入名称

时间:2012-09-07 07:01:46

标签: ruby-on-rails ruby ruby-on-rails-3 simple-form activemodel

使用ActiveAttr

class Filter
  include ActiveAttr::Model
  attribute term
  # Overriding to_key, to_param, model_name, param_key etc doesn't help :(
end

class SpecialFilter < Filter
end

如何覆盖ActiveModel以生成所有子类的(相同)预定义输入名称

= form_for SpecialFilter.new, url: 'xx' do |f|
  = f.text_field :term

所以我需要<input name='special_filter[term]' />

而不是<input name='filter[term]' />

注意:这种情况要复杂得多(使用simple_form和radios / checkboxes / dropdown等),所以请不要建议更改类的名称或类似的解决方法。我确实需要表单构建器使用一致的名称

2 个答案:

答案 0 :(得分:8)

试试这个:

= form_for SpecialFilter.new, as: 'filter', url: 'xx' do |f|
  = f.text_field :term

答案 1 :(得分:5)

正如Divya Bhargov回答的那样,如果您查看源代码,您会发现内部调用堆栈最终应如下所示。

 # actionpack/lib/action_view/helpers/form_helper.rb
 ActiveModel::Naming.param_key(SpecialFilter.new)

 # activemodel/lib/active_model/naming.rb 
 SpecialFilter.model_name

因此,如果您真的想在模型级别中执行此操作,则需要覆盖model_name到您的班级。

class SpecialFilter < Filter
  def self.model_name
    ActiveModel::Name.new(self, nil, "Filter")
  end
end    

此ActiveModel :: Name初始值设定项的参数为klass, namespace = nil, name = nil

但是model_name也在其他地方使用,例如error_messages_for,所以请小心使用它。