我有一个模型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
定义,但这会返回nil:NilClass
并破坏内容。
有更好的方法吗?
答案 0 :(得分: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
答案 1 :(得分:1)
如果您在save
定义中检查apikey
是否为nil
,如果是,则设置它,该怎么办?
答案 2 :(得分:1)
查看ActiveRecord::Callbacks&amp;特别是before_validation
。
答案 3 :(得分: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 =&gt;“bob”),你会自动创建一个摘要并分配给用户,你可能想要生成api密钥使用另一个库而不是MD5,例如SHA256,你也应该放一些用户可输入的字段,一个不断增加的数字(例如当前的日期时间)和一个盐。
希望这有帮助
答案 4 :(得分:0)
我相信这很有效......只需将方法放在model
。
def apikey=(value)
self[:apikey] = Digest::MD5.hexdigest(BCrypt::Password.create("jibberish").to_s)
end