redirect_to和render是否可以交换?

use*_*363 40 ruby-on-rails

对于下面的代码,如果用render或vise verse替换redirect_to会发生什么?

def create
  @product = Product.new(params[:product])

  respond_to do |format|
    if @product.save
      format.html { redirect_to(@product, :notice => 'Product was successfully created.') }

    else
      format.html { render :action => "new" }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

似乎可以在上面的代码中替换另一个.是否只有redirect_to或render必须使用的地方?渲染除了渲染视图外什么都不做.Redirect_to向服务器发送302请求,重定向后当前参数丢失.

谢谢.

hta*_*ata 113

如果您正在使用render,当用户刷新页面时,它将再次提交先前的POST请求.这可能会导致重复购买等不良后果.

在此输入图像描述

但是如果您正在使用redirect_to,当用户刷新页面时,它将再次请求相同的页面.这也称为发布/重定向/获取(PRG)模式.

在此输入图像描述

因此,redirect_to应该使用的地方是您正在执行HTTP POST请求,并且您不希望用户在完成请求时重新提交请求(这可能会导致重复项目和其他问题).

在Rails中,当模型无法保存时,render用于重新显示具有先前填充的相同条目的表单.这更简单,因为如果使用重定向,则必须使用参数或会话传递表单条目.副作用是,如果刷新浏览器,它将尝试重新提交以前的表单条目.这是可以接受的,因为它可能会以同样的方式失败,或者如果它现在成功,那么无论如何,用户应该首先期待它.

欲了解更多关于在深入的解释renderredirect,你应该阅读文章.

  • 注意:刷新*与*只是在URL栏中按Enter键相同.在URL栏中按Enter键只会向该URL发送GET请求.刷新重新提交最后一个请求(浏览器会跟踪). (2认同)

Mat*_*hew 9

重定向时,您将生成一个命中控制器方法的新请求,渲染只是呈现关联的视图.您在create中使用render,因为如果保存失败,您希望保持模型对象的状态,以便您可以呈现有关其错误的信息.如果您尝试重定向到new_product路径,则会创建一个新的模型对象并释放用户输入的所有表单数据以及任何错误等等

编辑(有更多信息):

您必须使用的情况的一个示例redirect_to是,您的视图模板使用未在您重定向的控制器方法中初始化的实例变量.所以你可能无法render {:action => 'index'}在你的create方法中调用,因为索引模板可能使用了一个@products变量,但你的只是初始化了@product所以它会导致异常