2010-01-28 83 views
0

我有一個網站模型,需要用戶驗證網站的所有權。更新屬性安全性的Rails:使用回調或attr_accessible?

由於堆棧溢出,我能夠從這裏找到用戶所有權驗證的解決方案:Validate website ownership in rails

模型後,通過驗證試驗存在時設置爲true的驗證屬性。

我遇到的問題是,當用戶想要編輯他或她的網站的屬性時,他或她可以在驗證屬性保持爲真的情況下輕鬆更改域名,從而允許用戶創建網站對象沒有驗證所有權。

我可以想出兩種方法來解決這個問題: 1.有一個回調,如果網站的域名發生變化,驗證就會變爲false。 2.在創建新對象時允許域名attr_accessible,但在更新時不允許。

我難以理解如何實現這些實際。

回答

2

我認爲你的選項#1是最佳路線。否則,您將進入嘗試協調創建和更新操作的行爲 - 您需要執行以處理選項2。

你可以重寫域名的setter,然後執行自定義邏輯,就像這樣:

在你的模型:

def domain=(the_domain) 
raise ValidOwnerRequired if verified? && domain != the_domain 
# if we got here then the this record is new and this is a creation attempt 
@require_domain_verification = true 
# do other stuff here.. 
end 

def require_domain_verification? 
    @require_domain_verification == true 
end 

然後對這個模型的觀察員:

def after_save(record) 
    if record.require_domain_verification? 
    SomeMailer.deliver_domain_verification(record) 
    end 
end 

類似的東西...

0

科迪,你的回答讓我在右邊跟蹤。非常感謝!

這是我去了我的情況:

def domain=(the_domain) 
    if domain != the_domain 
    self[:domain] = the_domain 
    self[:verified] = false 
    end 
    end 

它工作得很好。

+0

哎喲,但這與「新」行動混淆。 – 2010-01-28 02:15:02

3

回調和Active Record Dirty方法絕對是這種情況下的方式。

before_update :set_domain_status 

def set_domain_status 
    self.verified = false if self.domain_changed?  
end 

_changed?可以添加到任何屬性,如果值已經從最初從數據庫中加載,則返回true。

+0

我想我會去這個。謝謝託比! – 2010-01-28 06:12:56