更改模型的输入名称

Dmy*_*iak 6 ruby ruby-on-rails activemodel ruby-on-rails-3 simple-form

使用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
Run Code Online (Sandbox Code Playgroud)

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

= form_for SpecialFilter.new, url: 'xx' do |f|
  = f.text_field :term
Run Code Online (Sandbox Code Playgroud)

所以,而不是<input name='special_filter[term]' />我需要得到<input name='filter[term]' />

注意:场景更复杂(使用simple_form和radio/checkboxes/dropdown等),因此请不要建议更改类的名称或类似的解决方法.我确实需要使用表单生成器使用的一致名称.

ddb*_*ddb 8

试试这个 :

= form_for SpecialFilter.new, as: 'filter', url: 'xx' do |f|
  = f.text_field :term
Run Code Online (Sandbox Code Playgroud)


kin*_*pyo 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
Run Code Online (Sandbox Code Playgroud)

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

class SpecialFilter < Filter
  def self.model_name
    ActiveModel::Name.new(self, nil, "Filter")
  end
end    
Run Code Online (Sandbox Code Playgroud)

此ActiveModel :: Name初始化程序的参数是klass, namespace = nil, name = nil.

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