Rails - 在另一个控制器中验证模型并保持错误

时间:2013-06-27 09:38:51

标签: ruby-on-rails ruby validation rest activerecord

我有两个模型UserWantUser has_many: Want s。

Want模型除了user_id之外还有一个属性,即name

edit的{​​{1}}操作视图中,有两种形式。一个POST(PUT)到UsersController更新方法以更新用户,另一个POST到UsersController WantsController操作以向用户的帐户添加新create

这很好,我有它的工作,但是......

Want的{​​{1}}操作中,我重定向回create的{​​{1}}操作,以显示成功或WantsController验证错误。

问题是编辑操作会为表单创建一个新的@want,并且请求中的验证错误会丢失。

查看edit中的UsersController操作:

Want

以及create的编辑操作:

UsersController

因为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验证错误?

另外,这被认为是对Rails约定的验证吗?创建一个全新的页面似乎有点矫枉过正,因此用户可以使用一个字符串属性添加一个想要的东西!

感谢。

1 个答案:

答案 0 :(得分:0)

不是重定向,而是在这种情况下渲染更常见:

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

但是有一些缺点:

  • 如果users/edit模板发生更改并需要其他实例变量,则现在必须更改两个控制器操作。您可以使用包含呈现users/edit视图所需的所有内容的presenter object来解决此问题。
  • 如果users/edit页面上发生了很多事情,用户可能很难发现他们试图纠正的错误。如果是这种情况,我会争辩说,添加一个只显示创建新需求的表单的wants/new视图可以简化问题。您始终可以使用partialwants/newusers/edit之间共享表单代码。