我有一个只读属性的类:
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
由于我正在尝试分配受保护的属性,因此可预测会导致错误。这样做的恰当方法是什么?
答案 0 :(得分: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
通过这种方式,您将能够生成密钥,并且还可以确保它不会更新。
答案 1 :(得分: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