如何在ruby模型中设置默认属性

时间:2010-05-22 21:35:52

标签: ruby-on-rails ruby rails-models

我有一个模型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并破坏内容。

有更好的方法吗?

5 个答案:

答案 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

但你一定要看看deviseauthlogicclearance宝石

答案 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