2011-03-03 3 views
1

を作成するためのより良い方法は何ですか:通常、1はその親オブジェクトを介して、関連するモデルのインスタンスを構築しますSTIモデルインスタンスに

@child = @parent.children.build(params[:child]) 

しかし、我々は、STIを使用していて、私たちは同じで、このしばらくやってみたいです構文を破壊すると思われるサブクラスの1つとして構築してください。これは、(承認されたリストに対してタイプをチェックしていない周りのセキュリティ問題を無視する)私の知る限り、それを行うための最善の方法である:

@child = params[:type].classify.constantize.new(params[params[:type]]) 
@child.parent = @parent 

が、これはそれについて移動するための最良の方法ですか?私はすべての異なるサブクラスの型を構築するために単一のコントローラを使用しているので、型をパラメータとして指定する必要があります。お使いのコントローラで今

class BaseModel < ActiveRecord::Base 

private 
    # this will enable you to set the type field 
    def attributes_protected_by_default 
    super - [self.class.inheritance_column] 
    end 
end 

答えて

0

私は通常、このトリックを使用

@parent.children.build(params[:base_model]) 

確認のparamsください[:base_model]をハッシュがtypeと呼ばれるフィールドを持っています。私は通常、型を格納する隠しフォームフィールドを追加します。

適切なチェックを追加して、適切なサブタイプが作成されていることを確認してください。

:このトリックは良い厥Railsの3

+0

では動作しません、と私はそれはあなたがタイプが許可されたタイプの一つであることを確認するためにARの検証を使用できることを意味しますね。唯一の欠点は、params [:child_model]の形式で提供されているので、事前に何がわかっているのかわかりません(params [:type]の助けを借りてのみ)。私はこのパラメータを:child_modelハッシュに注入することができたと思います:) –

+0

これはレール3.1.rc8で私にとってはうまくいきません: –

+0

apidockによると、このメソッドはActiveRecord :: MassAssignmentSecurityに移動されていますモデルから設定してください。http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attributes_protected_by_default –

関連する問題