redirect_to vs. render - Michael Hartl的教程

时间:2014-08-14 12:54:36

标签: ruby-on-rails ruby-on-rails-4

通过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_urlif分支中,这个变量将由控制器动作提供吗?

2 个答案:

答案 0 :(得分:4)

如果@micropost.save返回false,则表示您的@micropost无效。换句话说:您有验证错误。可以通过@micropost.errors访问这些错误。您应该在视图中显示它们,以便用户知道他做错了什么。如果您重定向它将是一个全新的请求,@micropost.errors将不再可用。这就是他使用渲染的原因。

这方面的另一个方面是您需要使用用户输入的值重新填充表单。如果重定向这些值也将消失。要通过重定向保留错误和发布的值,您必须将它们保存在会话或其他内容中。改为渲染视图要容易得多。

答案 1 :(得分:0)

效率更高,因为渲染将简单地渲染视图,并将使用此控制器中提供的变量(与redirect_to相反,redirect_to将生成新的url请求并将执行请求的控制器+视图)。

这是该特定示例的最佳解决方案,而不是一般情况,因此您需要在redirect_to或render之间进行选择,具体取决于您在应用中的操作。