0

Rails のカスタム セッターから属性にアクセス (読み取り) しようとして困っています。

def password=(new_password)

  puts self.firstname # returns nil

  # Do other checks here before setting a hashed SCrypt password

end

firstname は (ユーザー) オブジェクトで定義されますが、firstname を呼び出しても値セットは得られません。カスタム セッターからさまざまな属性を読み取って、名、姓、および電子メール アドレスに対してパスワード チェックを行う必要があります。

4

3 に答える 3

0

対応するゲッターメソッドはありますか?

def password
  @password
end

または、それが本当に単純なゲッター/セッターのペアである場合

:attr_accessor password

あなたのコメントを更新してください:セッターで属性を設定する以外のことをしたいですか?

だから明らかに私はそれに対してアドバイスしなければなりません。ただし、次のようなことができます。

def password=(new_password)
  some_method(new_password)
  @password = new_password
end

これにより、セッターから new_password メソッドが渡され、インスタンス変数を新しい値に設定する前に、それを使用して他のことを行うことができます。

例のように、パスワードセッター内の firstname 属性にアクセスしようとしている場合は、次の方法で実行できます。

def password=(new_password)
  some_method(firstname)
  @password = new_password
end  

getter メソッドを呼び出すために self を使用しません。

于 2013-03-25T21:11:25.463 に答える
0

私のアプリのどこかに問題があるようです。正常に動作する最小限のテスト アプリケーションを作成しました。

class User < ActiveRecord::Base

  def password
    password ||= SCrypt::Password.new(password_hash)
  end

  def password=(new_password)

    logger.info 'DEBUG: self.lastname: ' + self.lastname.to_s

    self.password_hash = SCrypt::Password.create(new_password, :key_len => 512, :salt_size => 32)

  end

end

コンソールでは正常に動作します:

Loading development environment (Rails 3.2.12)
2.0.0-p0 :001 > u = User.new
 => #<User id: nil, firstname: nil, lastname: nil, password_hash: nil, created_at: nil, updated_at: nil>
2.0.0-p0 :002 > u.lastname = "Some Lastname"
 => "Some Lastname"
2.0.0-p0 :003 > u.password = 'test'
DEBUG: self.lastname: Some Lastname
 => "test"

したがって、Rails 固有の問題ではなく、アプリケーション内の宝石 / 何か / どこかに関連する問題のようです。リスト失礼します。

于 2013-03-26T16:08:41.287 に答える