如何在rails模型中使用before_validation为attr_reader属性分配默认值

时间:2013-10-09 15:35:54

标签: ruby-on-rails activerecord

我有一个“主题”模型,其中包含一个名为“utid”(唯一主题ID)的属性。 创建主题时,我们需要为utid赋值。 此外,一旦给出值,utid应该是唯一的和只读的。

以下是一个例子:

class Topic < ActiveRecord::Base
  attr_reader :utid
  before_validation :gen_utid, on: :create
  validates :utid, presence: true, uniqueness: true

  private
  def gen_utid
    self.utid = RandomToken.genf(32)
  end
end

但是在创建新主题时它总是会引发异常:

ActiveRecord::RecordInvalid: Validation failed: Utid can't be blank

似乎无法在gen_utid中分配utid值,但我不知道如何解决它。你能帮我解决一下,还是有其他方法可以达到同样的要求?感谢〜

1 个答案:

答案 0 :(得分:1)

我认为Vimsha走在正确的轨道上......

而不是:

attr_reader :utid

试试这个:

attr_readonly :utid

从Rails文档中,“列为readonly的属性将用于创建新记录,但更新操作将忽略这些字段。”

见这里:http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-attr_readonly