2013-10-07 21 views
0

我有一類具有隻讀屬性:導軌 - 汽車只能生成讀取屬性上創建

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

你可以嘗試'自[:鍵] = [...]'呢? – MrYoshiji

+0

您可以嘗試執行'before_validation_on_create:generate_key'而不是'before_create:generate_key'。由於在創建之前檢查驗證(所以,在generate_key之前),它可能會導致一些麻煩。 –

+0

它是你的完整模型定義?我發現http://stackoverflow.com/questions/11383061/rails-attr-readonly-doesnt-work,並想知道如果這是你的情況。 –

回答

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 

這樣,您就能夠生成密鑰,也可以確保它做沒有得到更新。

+0

是的,這絕對有效。我很驚訝Rails尚未解決這個問題。這似乎是相當普遍的。 –

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