7

使用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/dropdowns 等),所以请不要建议更改类的名称或类似的解决方法。我确实需要表单构建器使用一致的名称。

4

2 回答 2

8

尝试这个 :

= form_for SpecialFilter.new, as: 'filter', url: 'xx' do |f|
  = f.text_field :term
于 2012-09-07T07:22:22.650 回答
6

正如 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,因此请谨慎使用。

于 2012-09-08T12:34:40.193 回答