Ruby on rails 重定向到vs.render-Michael Hartl';s教程
浏览Hartl的教程,在MicroPost控制器中的清单10.42中Ruby on rails 重定向到vs.render-Michael Hartl';s教程,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,浏览Hartl的教程,在MicroPost控制器中的清单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 = [] rend
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\u项
,因为render
它本身不提供变量
我的问题是-为什么不像这样使用重定向到root\u url
在
if
分支中,该变量将由控制器操作提供?由于render将简单地呈现视图,并将使用该控制器中提供的变量,因此效率更高(与重定向相反,重定向将发出新的url请求并执行请求的控制器+视图)
这是该特定示例的最佳解决方案,不是一般的,因此您需要根据您希望在应用程序中执行的操作在重定向到或渲染之间进行选择。如果
@microspost.save
返回false
,则表示您的@microspost
无效。换句话说:您有验证错误。这些错误可以通过@micropost.errors
访问。您应该在视图中显示它们,以便用户知道自己做错了什么。如果您重定向,它将是一个全新的请求,@microspost.errors
将不再可用。这就是他使用渲染的原因
另一方面,您需要使用用户输入的值重新填充表单。如果重定向,这些值也将消失。要通过重定向保留错误和发布的值,您必须将它们保存在会话或其他内容中。只渲染视图要容易得多。本文可能会有所帮助:。虽然是Rails 3,但它应该仍然适用。我模糊地理解两者之间的区别。我的问题是——为什么作者在这里选择了一个而不是另一个。我模糊地理解两者之间的区别。我的问题是-为什么作者在这里选择一个而不是另一个。因为他不需要做url请求,也不需要从另一个控件获取变量,而他所需要的都已经存在了。如果他需要将用户重定向到其他地方,那么重定向到可能更有意义。micropost的唯一要求是它不是空的。我想你可能是对的,我可能会在多回答几次后接受它,即使唯一的要求是它不是空的,我仍然会使用render而不是redirect。当重定向时,您仍然需要做一些“特殊”的事情来通知用户验证失败,并且他的micropost不应该为空。如果使用render,则可以按预期使用框架:在视图中的
@microspost.errors
中显示错误,而无需任何额外工作。