0

我有一个具有只读属性的类:

class User < ActiveRecord::Base
  attr_readonly :key
  validates_uniqueness_of :key
end

我想在:key创建对象时自动生成属性,并且永远不要在创建后更改属性。我试过这个:

class User < ActiveRecord::Base
  attr_readonly :key
  validates_uniqueness_of :key

  before_create :generate_key

  private
    def generate_key
      self.key = Digest::MD5.hexdigest(Time.now.to_s + rand(100000).to_s)[0..5]
    end
end

由于我正在尝试分配受保护的属性,因此可以预见会导致错误。这样做的适当方法是什么?

4

2 回答 2

0

您可以将密钥设置为:-

attr_accessible :key

然后再添加一个验证

validate :check_if_key_changed, :on=> :update
validates_uniqueness_of :key
before_create :generate_key

private
  def generate_key
    self.key = Digest::MD5.hexdigest(Time.now.to_s + rand(100000).to_s)[0..5]
  end

def check_if_key_changed
  if self.key_changed?
    errors.add(:key,"cant change key")
  end
end

通过这种方式,您将能够生成密钥,并且还可以确保它不会被更新。

于 2013-10-07T18:11:52.617 回答
0

未经测试:

def generate_key
  self[:key] = Digest::MD5.hexdigest(Time.now.to_s + rand(100000).to_s)[0..5]
end

或者:

def generate_key
  self.write_attribute :key, Digest::MD5.hexdigest(Time.now.to_s + rand(100000).to_s)[0..5]
end
于 2013-10-07T18:44:13.577 回答