2012-05-23 27 views
17

我有一個非常新手的問題。如何在更新之前檢查模型的對象是否與新參數一致?Rails 3 - 在更新之前檢查對象是否有效參數

我想變換:

def update 
    @obj = SomeModel.find(params[:id]) 

    if @obj.update_attributes(params[:obj]) 
    # That have been updated 
    else 
    # Ups, errors! 
    end 
end 

爲了這樣的事情:

def update 
    @obj = SomeModel.find(params[:id]) 

    if @obj.valid_with_new_params(params[:obj]) 
    @obj.update_attributes(params[:obj]) 
    else 
    # Ups, errors! 
    end 
end 

回答

35

爲了而不保存更新的屬性,你可以使用

@obj.assign_attributes(params[:obj]) 

然後以檢查對象是有效的,你可以叫

@obj.valid? 

如果對象是有效,您可以通過調用

@obj.errors 

看到錯誤(只調用.valid?後)如果對象有效的,你可以通過調用

@obj.save 

但是保存它,這一切通常的沒有必要。如果對象無效,那麼ActiveRecord不會將對象保存到數據庫,因此當您離開控制器操作時,所有屬性更改都會被遺忘。另外,由於無效記錄將不會保存到數據庫,因此您可以再次調用Object.find()以獲取原始對象。

+4

@ obj.attributes(params [:obj])後,調用@ obj.save。 –

+0

本文寫作時,此回答中顯示的'attributes()'方法已被棄用。而是使用'assign_attributes(new_attributes)'或別名'attributes =(new_attributes)'。因此,這個答案的第一行應該是'@ obj.assign_attributes(params [:obj])''。請參閱[ActiveRecord :: AttributeAssignment](http://api.rubyonrails.org/classes/ActiveRecord/AttributeAssignment.html) – user664833

+0

Re:'assign_attributes(new_attributes)' - 請注意*唯一的屬性集是通過鍵命名的參數哈希*。所以如果你有一個現有的對象,你可以添加/合併屬性的一個子集。 – user664833

0

,如果傳遞的參數不會產生有效的對象的對象不會被保存,這樣你就可以用你的方式就好了。您可以使用@obj.errors陣列查看錯誤(如果有)。

0

update_attributes方法驗證對象並在對象無效時返回false。所以,你可以這樣寫:

if @obj.update_attributes(params[:obj]) 
    # That have been update 
else 
    # Ups, errors! 
end 
3

可以調用valid?方法來運行驗證。

如果您的某些驗證取決於數據庫中其他對象的狀態,則不能保證後續保存會成功。特救也可能失敗,以驗證無關的原因(例如一個外鍵約束)

我不知道爲什麼你要這個模式

+1

我節省了數任何錯誤不同模型的對象。所以我收集每個模型的驗證錯誤,然後在一個彈出窗口中顯示它。 – ExiRe

0

答案是,你可以定義一個方法

def valid_with_new_params(hash) 
    self.attributes = hash 
    valid? 
end 

但那將是不必要的,因爲@obj.update_attributes(params[:obj])返回true如果OBJ已成功更新和false否則。另請注意,在內部,update_attributes方法將在@obj上運行所有驗證,以便在更新失敗時可以使用@obj.errors

+1

'attributes ='方法在Rails的新版本中被棄用 – apneadiving

+0

感謝@apneadiving不知道那:) – Gerry

0

要更新屬性,而不保存

@obj.attributes = params[:obj] 0r 
@obj.attributes = {:name => 「Rob」} 

然後,爲了檢查對象是有效的

@obj.valid? 

要檢查是否有

@obj.errors 
相關問題