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 に答える