2013-06-27 26 views
0

我有兩個模型UserWant。 A Userhas_many:Want s。Rails-在另一個控制器中驗證模型並保留錯誤

Want模型除了user_id之外還有一個屬性,那就是name

edit動作視圖UsersController有兩種形式。一個POST(PUT)更新用戶的UsersController更新方法,另一個POST更改爲WantsControllercreate操作,以向用戶的帳戶添加新的Want

這是很好,我有工作,但...

WantsController我重定向回UsersControlleredit行動表達成功或Want驗證錯誤的create作用。

問題是編輯操作爲表單創建了一個新的@want,並且驗證錯誤在請求中丟失。

退房在UsersControllercreate行動:

def create 
    @want = current_user.wants.build(params[:want]) 
    if @want.save 
     flash[:success] = "WANT created!" 
     redirect_to user_account_path current_user.username 
    else 
     #flash[:validation] = @want.errors <- I NEED THESE ERRORS FOR MY VIEW 
     redirect_to user_account_path current_user.username 
    end 
    end 

UsersController的編輯動作:

def edit 
    @want = @user.wants.build 
    super 
end 

因爲WantsController重定向我失去了對@want實例變量的錯誤。我可以將錯誤存儲在flash(如註釋中所示),但肯定這是完全濫用flash

所以我的問題是,我如何堅持這些錯誤橫跨動作,所以我可以在我的視圖中呈現Want驗證錯誤?

此外,這是否被認爲是Rails約定的驗證?似乎有點矯枉過正創建一個全新的頁面,以便用戶可以添加一個單一的字符串屬性!

謝謝。

+0

爲什麼不只是存儲的錯誤在其他類變量,像'@latest_errors = @ want.errors' –

+0

的瓦爾不會被保留到了該請求,這是個問題。 –

+0

我的意思是類變量(@@ latest_errors而不是@latest_errors),它們在開發環境中並不保留狀態,而是在生產中保留狀態。如果你願意,你也可以在開發中更改這個配置。只需更改開發配置文件(config/environments/development.rb),如下所示:'config.cache_classes = true' –

回答

0

而不是重定向,它多見於這種情況呈現:

if @want.save 
    … 
else 
    @user = current_user 
    render 'users/edit', status: 400 
end 

也有一些缺點,以這雖然:

  • 如果users/edit模板的變化和需要額外的實例變量,您現在必須更改兩個控制器操作。您可以通過使用presenter object來解決此問題,其中包含呈現users/edit視圖所需的所有內容。
  • 如果在users/edit頁面上發生了很多事情,用戶可能很難發現他們嘗試糾正的錯誤。如果是這種情況,我會爭辯說,添加一個wants/new視圖,只顯示用於創建新想要的表單將簡化事項。您始終可以使用partial共享wants/newusers/edit之間的表單代碼。
+0

是的,這是我擔心的解決方案。我不想渲染,因爲用戶將保持在本地主機:3000 /希望而不是他們來自的URL。這是一個棘手的問題,但我相信我會做點什麼。 –

+0

我認爲他們*應該*在該URL上。他們已經發布給它,並且POST失敗,因爲數據是無效的,所以它應該返回一個4xx響應代碼並解釋問題。這對於大多數Rails應用程序來說都是正常的行爲,IMO對HTTP規範很好的解釋。 – georgebrock

+0

除了Rails驗證錯誤以「200 OK」提供外,其他都是如此。 –

相關問題