2

attr_accessibleがデフォルトで使われているのですが、#250 in railscasts では使うattr_accessorので戸惑います。

チュートリアルではAuthentication from Scratch、コードは

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation
  attr_accessor :password
  ...
end

しかし、データベースには、実際には password_hash と password_salt のみが格納されており、attr_accessible と attr_accessor に一致しません。誰かこれについて少し説明してもらえますか?

4

2 に答える 2

2

attr_accessible一括割り当てによって設定できるモデル属性のホワイト リストを指定します。(ソース

attr_accessorこのモジュールの名前付き属性を定義します。名前は symbol.id2name で、インスタンス変数 (@name) とそれを読み取るための対応するアクセス メソッドを作成します。また、name= というメソッドを作成して、属性を設定します。(ソース

したがって、基本的に、データベースに依存しない属性が必要な場合は、 を使用しますattr_accessible。データベースによってサポートされているかどうかに関係なく、属性を一括で割り当てる必要がある場合は、 を使用しますattr_accessible。データベースに依存しない属性を一括で割り当てる必要がある場合は、両方を使用します。

これはすべて、更新された質問のコンテキストで完全に理にかなっています。移行では、password_hashフィールドは db-backed 属性としてモデルに追加されます。次に、コード内でpassword(およびその確認) が、データベースでサポートされていない属性として追加されます。この行は、モデルが保存される前にメソッドをbefore_save :encrypt_password呼び出します。encrypt_passwordその方法では、データベースに裏付けられた属性は、データベースに支えられていない属性から派生します。必要ない理由は、 attr_accessor :password_hash( のように) 一括割り当てされることはpasswordなく、明示的に設定されるためです。わかる?

于 2013-05-25T05:06:25.690 に答える
0

attr_accessor は仮想属性の作成用です
attr_accessible は一括割り当て用です

チュートリアル attr_accessor :password によると
(パスワード フィールドがデータベースにないため)
attr_accessible :password, :password_confirmation (一括割り当てのため)

password_salt と password_hash は before_save コールバックのみにあるため、これらを attr_accessible または attr_accessor に記述する必要はありません

于 2013-05-25T05:38:02.327 に答える