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 为空)。

我尝试覆盖save定义,但是当我更新模型时这似乎会导致问题,因为它会覆盖这些值。我尝试覆盖initialize定义,但那是返回 anil: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

but you should definitely take a look at devise, authlogic or clearance gems

于 2010-05-22T21:44:07.057 回答
1

如果在你的save定义中,你检查是否apikeynil,如果是,你设置它怎么办?

于 2010-05-22T21:38:05.997 回答
1

看看ActiveRecord::Callbacks & 特别是before_validation.

于 2010-05-22T21:43:53.940 回答
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")并且您将获得自动创建并分配给用户的摘要,您可能希望使用除 MD5 之外的另一个库(例如 SHA256)生成 api 密钥,您还应该可能会放置一些用户可输入的字段,一个不断增加的数字(例如当前日期时间)和一个盐。

希望这可以帮助

于 2010-05-22T21:42:54.917 回答
0

I believe this works... just put the method in your model.

def apikey=(value)  
  self[:apikey] = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)  
end
于 2010-05-22T21:48:20.667 回答