我有两个模型User
和Want
。 User
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约定的验证吗?创建一个全新的页面似乎有点矫枉过正,因此用户可以使用一个字符串属性添加一个想要的东西!
感谢。
答案 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
视图可以简化问题。您始终可以使用partial在wants/new
和users/edit
之间共享表单代码。