Ruby on rails Rails--在创建时自动生成只读属性

Ruby on rails Rails--在创建时自动生成只读属性,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个具有只读属性的类: class User < ActiveRecord::Base attr_readonly :key validates_uniqueness_of :key end 这会导致一个错误,因为我试图分配受保护的属性。执行此操作的适当方法是什么?您可以将密钥设置为:- attr_accessible :key 然后再添加一个验证 validate :check_if_key_changed, :on=> :update validates_uniq

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

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

这会导致一个错误,因为我试图分配受保护的属性。执行此操作的适当方法是什么?

您可以将密钥设置为:-

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
通过这种方式,您将能够生成密钥,并且还可以确保它不会被更新。

未测试:

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


您是否可以尝试改为
self[:key]=[…]
呢?您是否可以尝试在创建:生成密钥之前执行
而不是在创建:生成密钥之前执行
。由于验证是在创建之前检查的(因此,在generate_键之前),因此可能会导致一些问题?我发现并想知道你现在的处境是否如此。是的,这确实有效。我很惊讶Rails还没有解决这个问题的方法。这似乎是相当普遍的。
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