ATTR_ACCERSERとATTR_ACCESSALIBERIABLEを使用して、同じフィールドで使用できます
-
11-10-2019 - |
質問
次のコードでバックグラウンドで何が起こりますか?
class User < ActiveRecord::Base
attr_accessor :name
attr_accessible :name
end
ヒント:クラスをインスタンス化すると、データベースに固執しますか?なぜまたはなぜですか?
解決 3
簡単な答えをありがとう!あなたの答えを組み合わせて、このパズルを理解するために必要な作品を与えてくれました。
(関連する問題では、「オブジェクトは#inspectをサポートしていない」や「nil:nilclassの「未定義のメソッド」」などの多くのnilエラーを取得していました。完全に。)
この特定のケースを試してみることで、これが私が見つけたことです。
実際、名前フィールドはデータベースに持続しません。
user = User.new(:name=>"somename")
オブジェクトに属性のみを設定しますが、データベースの名前列を保持しません。次の「Rails Console」出力が表示されます。
> user
=> <User id: nil, created_at: nil, updated_at: nil>
> user.save
=> true
> user
=> <User id:1, created_at: 2011-01-19 12:37:21, updated_at: 2011-01-19 12:37:21>
これは、ATTR_ACCERSERによって作成されたセッターがActiverEcordのセッター *(データベースの永続性の世話をする)をオーバーライドするためだと思います。ただし、次のように、オブジェクトから[名前]フィールドから値を取得できます。
> user.name
=> "somename"
したがって、結論として、私はフィールドでattr_accessorを使用することで、データベースに持続しないことにつながる可能性があることを学びました。また、ATTR_ACCESSIBLEは、外部からアクセスできるはずのデータベース内のフィールドを説明していると思いましたが、この場合には違いがないようです。
他のヒント
attr_accessorはRubyコードであり、データベースに列がないが、フォームにフィールドを表示したい場合に使用されます。これを許可する唯一の方法は次のとおりです attr_accessor :fieldname
また、必要に応じて、このフィールドを自分の見解やモデルで使用することもできますが、ほとんどはあなたの見解では使用できます。
ATTR_ACCESSIBLEを使用すると、Andyが上記で逃れたように、マス割り当てを許可するすべての列をリストできます。これの反対はattr_protectedです。つまり、このフィールドには、誰にもマス割り当てが許可されたくないということです。それ以上に、それはあなたのデータベース内のフィールドになるでしょう、あなたが誰も一緒にいじくり回してほしくないでしょう。ステータスフィールドなどのように。
ほとんどの場合、使用する必要はありません attr_accessor
フィールドがの列の場合 users
データベースのテーブル。 ActivereCordはあなたのためにそれを理解します。
attr_accessible
マス割り当てを介してフィールドを割り当てることを可能にします(例: update_attributes
)。これはセキュリティ目的に適しています。からの詳細 MassAssignmentsEcurity APIドキュメント.
継承するので ActiveRecord
, 、あなたが電話するとき、それは持続します save
メソッド(ただし、インスタンス化されている場合はそうではありません)。
そのモデルの属性がない場合、私は想定しています ActiveRecord
データベースに新しい行を保存するだけです(つまり、オブジェクトのみが持続します id
)。あなたが後であなたに属性を追加するかもしれないので、これは理にかなっています User
モデル、および永続的なインスタンスは引き続き取得可能である必要があります。