2013-10-09 70 views
0

我有一個名爲「utid」(唯一主題ID)屬性的「Topic」模型。 創建主題時,我們需要爲utid分配一個值。 此外,一旦給定值,utid應該是唯一的並且只讀。如何使用rails模型在after_validation中爲attr_reader屬性指定默認值

下面是一個例子:

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價值,但我不不知道如何解決它。你能幫我弄清楚,還是有其他方法可以達到同樣的要求嗎?謝謝〜

+0

確定'RandomToken.genf(32)'的作品如預期? –

+0

你正在爲utid定義attr_reader,它只生成一個getter(沒有setter)。所以當你做self.utid =''時,它什麼都不做 – usha

+0

@BillyChan是的,我很確定。 –

回答

1

我覺得Vimsha是在正確的軌道上......

相反的:

attr_reader :utid 

試試這個:

attr_readonly :utid 

從Rails的文檔「屬性列爲只讀將用於創建新記錄,但更新操作將忽略這些字段。「

在這裏看到:http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-attr_readonly

+1

使用attr_accessor表示它不再只讀... –

+0

這不是你想要的嗎?寫信給它? –

+0

創建主題時只寫一次... –

相關問題