通过Hartl的教程,在清单10.42 的微博控制器中,我们有
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
所以在else
分支中我们需要放空@feed_items
因为渲染
本身并不提供变量。
我的问题是 - 为什么不使用redirect_to root_url
在if
分支中,这个变量将由控制器动作提供吗?
答案 0 :(得分:4)
如果@micropost.save
返回false
,则表示您的@micropost
无效。换句话说:您有验证错误。可以通过@micropost.errors
访问这些错误。您应该在视图中显示它们,以便用户知道他做错了什么。如果您重定向它将是一个全新的请求,@micropost.errors
将不再可用。这就是他使用渲染的原因。
这方面的另一个方面是您需要使用用户输入的值重新填充表单。如果重定向这些值也将消失。要通过重定向保留错误和发布的值,您必须将它们保存在会话或其他内容中。改为渲染视图要容易得多。
答案 1 :(得分:0)
效率更高,因为渲染将简单地渲染视图,并将使用此控制器中提供的变量(与redirect_to相反,redirect_to将生成新的url请求并将执行请求的控制器+视图)。
这是该特定示例的最佳解决方案,而不是一般情况,因此您需要在redirect_to或render之间进行选择,具体取决于您在应用中的操作。