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
:
では動作しません、と私はそれはあなたがタイプが許可されたタイプの一つであることを確認するためにARの検証を使用できることを意味しますね。唯一の欠点は、params [:child_model]の形式で提供されているので、事前に何がわかっているのかわかりません(params [:type]の助けを借りてのみ)。私はこのパラメータを:child_modelハッシュに注入することができたと思います:) –
これはレール3.1.rc8で私にとってはうまくいきません: –
apidockによると、このメソッドはActiveRecord :: MassAssignmentSecurityに移動されていますモデルから設定してください。http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attributes_protected_by_default –