17

私はMichaelHartlによるRailsチュートリアルを行っていますが、次のように追加するだけです。

has_secure_password

あなたのモデルクラスに、そしてたくさんの魔法が起こります。

このメソッドは、私のモデルクラスが拡張するにActiveModel::SecurePassword含まれているモジュールからのものであることを理解しています。ActiveRecord::Base

私が理解していないのは、その1行をクラス定義に追加したときに何が起こっているのかということです。誰かができるだけ詳しく説明してもらえますか?私は本当に何が起こっているのかを理解したいと思っています。アプリがどのように機能するかわからないまま、アプリに何かを投げかけるだけではありません。

(私が混乱している理由を理解するのに役立つ場合、私はJavaのバックグラウンドを持っており、Rubyは初めてです)

4

1 に答える 1

16

何かが何をしているのかを理解する最も簡単な方法は、ソースを調べることです!この場合、それはActiveModel::SecurePasswordのドキュメントになります。それから、あなたはそれがこれをするのを見ることができますhas_secure_password

def has_secure_password
  # Load bcrypt-ruby only when has_secure_password is used.
  # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library.
  gem 'bcrypt-ruby', '~> 3.0.0'
  require 'bcrypt'

  attr_reader :password

  validates_confirmation_of :password
  validates_presence_of     :password_digest

  include InstanceMethodsOnActivation

  if respond_to?(:attributes_protected_by_default)
    def self.attributes_protected_by_default
      super + ['password_digest']
    end
  end
end

英語で説明すると、この関数は次のようになります。

  1. bcrypt-rubyGemをロードし、を必要としますbcryptbcryptは、ウィキペディアで詳しく知ることができる安全なハッシュ関数です。
  2. と呼ばれるモデルに読み取り専用属性を追加しますpassword
  3. パスワードが。と呼ばれる別のフィールドによって確認されていることを検証しますpassword_confirmation。つまり、確認のためにパスワードを2回入力する必要があります。
  4. モデルを保存する前に、password_digestが存在することを確認します。
  5. インスタンスメソッドをロードします。この場合はauthenticate(パスワードが正しい場合はtrueを返し、そうでない場合はfalseを返します)password=、渡されたパスワードをpassword_digest属性に暗号化します。
  6. メソッドにデフォルトで保護されている属性がある場合、これは保護されている属性password_digestのリストにも追加されます。(したがって、大量に割り当てられるのを防ぎます。)

ActiveModel :: SecurePasswordのドキュメントと、そのインスタンス属性に関する詳細なドキュメントで詳細を確認できます。

于 2013-03-20T03:53:02.607 に答える