对于下面的代码,如果用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

在上面的代码中,用一个替换另一个似乎没问题.是否有一个只需要使用重定向或渲染的地方?"渲染"只会渲染视图.重定向_to向服务器发送302请求,重定向后当前参数丢失.

谢谢

推荐答案

如果您使用的是render,当用户刷新页面时,它将再次提交上一个POST请求.这可能会导致重复购买等意外结果.

在此处输入图像描述

但是如果您使用的是redirect_to,当用户刷新页面时,它只会再次请求相同的页面.这也被称为Post/Redirect/Get (PRG)模式.

在此处输入图像描述

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

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

有关renderredirect的更深入解释,请阅读本article.

Ruby-on-rails相关问答推荐

Rails Heroku部署:预编译assets资源 失败.SassC::语法错误

是否从已转换为字符串的数组中提取符号?

如何在 JR gem 中指定每个资源的最大页面大小配置

如何通过graphqlMutations 从rails销毁当前用户会话

Ruby on Rails 让外键工作

URL 中的 Rails slugs - 使用 Active Record Model Post 的 Title 属性而不是 ID

attr_accessible(*attributes) 和 attr_protected(*attributes) 有什么区别?

如何将动态 Ruby 代码嵌入到 Slim 模板中的javascript部分?

如何在 Windows 中更新 ruby

Ruby/Rails 中的类方法与常量

使用 Ruby on Rails 从原始 IP 地址获取用户国家名称

如何在 Ruby on Rails 中的 cookie 上设置 HttpOnly 标志

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

Post.all.map(&:id) 是什么意思?

如何在 Rails 3 中将多个属性传递给 find_or_create_by?

rails respond_to format.js API

如何在 Rails 迁移中判断数据库类型?

ActiveModel::MissingAttributeError:无法使用 FactoryGirl 写入未知属性ad_id

Rails 在 id 字段上重置种子的方法

在 Rails 4.1 中,如何通过枚举符号查找记录?