1

モデルがあり、モデルUserを作成するときに、いくつかの API キーを実用的にセットアップしたいと思います。具体的には次のとおりです。
@user.apikey = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)

User.create!(:email=>"something@test.com")実行して、ランダムに生成された API キーとシークレットを使用してユーザーを作成できるようにしたいと考えています。

現在、コントローラーでこれを行っていますが、デフォルトのユーザーをファイルに追加しようとするとseeds.rb、SQL エラーが発生します (apikey が null であると言っています)。

定義をオーバーライドしようとしsaveましたが、値をオーバーライドするため、モデルを更新すると問題が発生するようでした。定義をオーバーライドしようとしましinitializeたが、それは a を返し、nil:NilClass物事を壊しています。

これを行うより良い方法はありますか?

4

5 に答える 5

4

コールバックと ||= ( = オブジェクトが nil でない場合を除く) :) を使用する

class User < ActiveRecord::Base
  before_create :add_apikey #or before_save

  private
  def add_apikey
    self.apikey ||= Digest::MD5.hexdigest(BCrypt::Password.create(self.password).to_s)
  end
end

ただし、 deviseauthlogic、またはclearance gemsを必ず確認する必要があります

于 2010-05-22T21:44:07.057 に答える
1

save定義で、 が であるかどうかを確認apikeyし、nilそうであれば設定するとどうなるでしょうか。

于 2010-05-22T21:38:05.997 に答える
1

ActiveRecord::Callbacks & 特にを見てくださいbefore_validation

于 2010-05-22T21:43:53.940 に答える
0

私はこれがうまくいくと信じています...あなたのmodel.

def apikey=(value)  
  self[:apikey] = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)  
end
于 2010-05-22T21:48:20.667 に答える
0
class User
    def self.create_user_with_digest(:options = { })
        self.create(:options)
        self.apikey = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)
        self.save
        return self
    end
end

次に、User.create_user_with_digest(:name => "bob")を呼び出すと、自動的に作成されてユーザーに割り当てられたダイジェストが取得されます。おそらく、SHA256 などの MD5 以外の別のライブラリで API キーを生成する必要があります。おそらく、ユーザーが入力できるフィールド、継続的に増加する数値(現在の日時など)、およびソルトも配置します。

お役に立てれば

于 2010-05-22T21:42:54.917 に答える