阅读Hartl的教程,在microposts Controller 中的 list 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分支中,该变量将由 Controller Action 提供吗?

最佳答案

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

这样做的另一方面是,您将需要使用用户输入的值来重新填充表单。如果重定向,这些值也将消失。要通过重定向保留错误和发布的值,您必须将其保存在 session 或其他内容中。仅渲染 View 要容易得多。

关于ruby-on-rails - redirect_to与渲染-Michael Hartl的教程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25308572/

10-09 00:55