1

私はSOLIDを学び、RailsアプリにSRPを導入しようとしています。基本認証を使用した次のユーザーモデルがあります。

class User < ActiveRecord::Base
  attr_accessible :password, :password_confirmation
  attr_accessor :password

  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of     :password, :on => :create

  def self.authenticate(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

  def self.generate_random_password
    return ActiveSupport::SecureRandom.hex(12)
  end
end

すべての認証ロジックを次のようなモジュールに移動したいと思います。

module Authentication

  attr_accessible :password, :password_confirmation
  attr_accessor :password

  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of     :password, :on => :create

  def self.authenticate(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

  def self.generate_random_password
    return ActiveSupport::SecureRandom.hex(12)
  end
end

そして、私のユーザーモデルは次のようになります。

class User < ActiveRecord::Base
  include Authentication #SRP in action! :P
end

そして今、エラーが始まります:

Authentication:Moduleの未定義のメソッド `attr_accessible'

このエラーを修正するにはどうすればよいですか?これが私のRailsアプリにSRPを導入するための最良のスタートであると確信しています。

ありがとう

4

1 に答える 1

2

attr_accessibleメソッドが間違ったスコープで呼び出されています。これを修正するには、懸念事項を確認してください。

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

これにより、次のようになります。

module Authentication
  extend ActiveSupport::Concern
  included do
    attr_accessible :password, :password_confirmation
  end
  ...
end

これにより、クラスとインスタンスのメソッド定義も処理されます。

注:具体的には、複数の責任がモジュールに分割されている場合でも、同じクラス内で複数の責任が共有されているため、これはSRPを完全には達成しません。参照または装飾によるクラス構成は、より厳密な解決策になりますが、モジュールの実用的なアプローチを好みます。

于 2012-07-16T08:24:30.217 に答える