2011-03-28 52 views
1

我正在從一個窗體更新兩個模型的屬性。在更新Rails時顯示來自兩個模型的錯誤消息

User.transaction do 
      begin 
      @user.update_attributes!(params[:user]) 
      @board.update_attributes!(params[:board]) 
      rescue ActiveRecord::RecordInvalid 
     end 
     end 

當@ user.update_attributes產生錯誤時,事務停止,錯誤消息顯示在視圖中。

但是我想嘗試更新@user和@board並獲取兩者的錯誤消息,以便用戶可以一次性更正所有錯誤。

我該怎麼做?

非常感謝您提前。

回答

0

你可以做到以下幾點:

User.transaction do 
    @user.update_attributes(params[:user]) 
    @board.update_attributes(params[:board]) 
    raise ActiveRecord::Rollback unless @user.valid? && @board.valid? 
end 

這將確保兩個更新屬性方法都會運行,以便您可以獲取兩個對象的錯誤消息。如果任何一個對象都無效,但沒有更改將持久保存到數據庫。

0

我認爲在方法名稱@user.update_attributes!(params[:user])有一些錯誤,它應該是這樣的@user.update_attributes(params[:user])或者一旦你需要交叉檢查你的參數值是否正確或否則你的代碼看起來是正確的。您可以獲得幫助update_attributes

1

您只需要使用update_attributes的爆炸(!)版本。嘗試:

User.transaction do 
    if @user.update_attributes(params[:user]) && @board.update_attributes(params[:board]) 
    ...do stuff... 
    else 
    render ... (go back to the action the user got here from) 
    end 
end 

然後在您的視圖代碼把用一個條件像if @user.errors.any?一個錯誤阻止。

update_attribtues的重磅版本和大多數activerecord方法意味着如果失敗會引發錯誤,常規版本只返回false而不保存,所以你可以使用它,只要它可以失敗,你只需要採取基於成功/失敗的行動。僅使用爆炸的版本時,它的不正常失敗,或當你想顯示某種原因,500的屏幕或東西...

相關問題