0

ユーザーモデルにこのプライベートメソッドがあります

class User < ActiveRecord::Base
  attr_accessible :email, :fullname, :password, :username
  has_secure_password
  before_create { generate_token(:remember_token) }
  .
  .
  private
    def generate_token(col)
      begin
        self[col] = SecureRandom.urlsafe_base64
      end while User.exists?(col => self[col])
    end

end

どうすればgenerate_tokenを他のモデルで利用できるようにできますか?ありがとう

4

2 に答える 2

2

いくつかのアプローチ:

  • わずかに依存:

行う:

class User < ActiveRecord::Base

  before_create { User::Helpers.new(self).generate_token(:remember_token) }

  class Helpers < Struct.new(:user)
    def generate_token(col)
      begin
        user.send("#{col}=", SecureRandom.urlsafe_base64)
      end while User.exists?(col => user.send(col))
    end
  end
end
  • 独立: オブジェクトをクラスに渡さずuser、メソッドにランダムなトークンをレンダリングさせ、モデルから割り当てます。
于 2013-03-12T15:50:47.307 に答える
2

ここには多くのオプションがあります:

  • プレーンでシンプルな Ruby モジュールを使用します。

    module TokenRememberable
      private
      def generate_token(col)
        begin
          self[col] = SecureRandom.urlsafe_base64
        end while User.exists?(col => self[col])
      end 
    end
    
    class User < ActiveRecord::Base
      include TokenRememberable
      before_create { generate_token(:remember_token) }
    end
    
  • より複雑な機能については、 ActiveSupport::Concern を使用します。

    module TokenRememberable
      extend ActiveSupport::Concern
    
      # thanks to Concern, this block wil be evaluated 
      # in the context of the including class
      included do 
        before_create { generate_token(:remember_token) }
      end
    
      private
      def generate_token(col)
        begin
          self[col] = SecureRandom.urlsafe_base64
        end while self.class.exists?(col => self[col])
      end 
    end
    
    class User < ActiveRecord::Base
      include TokenRememberable
    end
    
  • 専用クラスで機能を抽出し、場合によってはコンポジションを使用する

    # we only need a class method here, but you can also build 
    # full-fledged objects as you need
    class TokenGenerator 
      def self.generate_token
        # your generation logic here
      end  
    end
    
    class User
      def after_initialize
        @token_generator = TokenGenerator # or TokenGenerator.new( self ), for instance
      end
      attr_reader :token_generator
      delegate :generate_token, to: :token_generator # optionnaly use delegation
    end
    

: これは実際には Rails の問題ではなく、Ruby の問題です。使用している言語についてもっと文書化する必要があります... モジュールは非常に一般的なイディオムです。必要であれば良い参考書をお貸しします

于 2013-03-12T15:51:10.470 に答える