Rails - 在create上自动生成只读属性

时间:2013-10-07 17:36:32

标签: ruby-on-rails activerecord

我有一个只读属性的类:

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

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

2 个答案:

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