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