【问题标题】:redirect_to show page instead update in controller? railsredirect_to 显示页面而不是在控制器中更新?导轨
【发布时间】:2017-08-30 10:39:19
【问题描述】:

正在我的控制器操作中进行类似这样的重定向

format.html { redirect_to product_path(@product) }

这是带我去PUT /products/123456

但我想去GET /products/123456。 有人可以解释一下为什么会这样。我应该使用什么确切的辅助方法来处理 GET 请求?

根据文档product_path(@product) 是所有GET, PUT/PATCHDELETE. 的共同点

我找不到任何选项来传递类似的东西

format.html { redirect_to product_path(@product) }, method: :get

redirect_to api 文档中。请解释我如何才能做到这一点。谢谢

更新:

def delete_product_media
  @product = Product.find(params[:id])
  @product_media = ProductMedium.where(id: params[:product_media_ids])

  respond_to do |format|
    if @product_media.update_all(deleted_at: Time.zone.now) == params[:product_media_ids].count
      flash[:notice] = 'Media deleted'
      flash.keep(:notice)
      format.html { redirect_to product_path(@product), method: :get }
    else
      flash[:notice] = 'Something went wrong!'
      flash.keep(:notice)
      format.html {redirect_to product_path(@product) }
    end
  end

end

【问题讨论】:

  • 你能发布更多的代码吗?

标签: ruby-on-rails ruby


【解决方案1】:

带有redirect_to(默认HTTP 302 Found)的重定向应该保留该方法,尽管并非总是如此。如果要强制使用GET,可以使用303 See Other

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302

即使规范要求方法和主体在执行重定向时不得更改,但并非所有用户代理都符合此处,您仍然可以在那里找到有缺陷的软件。因此,建议仅将 302 代码设置为 GET 或 HEAD 方法的响应,并改用 307 临时重定向,因为在这种情况下明确禁止更改方法。

如果您希望将使用的方法更改为 GET,请改用 303 See Also。当您想对不是上传资源的 PUT 方法给出答案时,这很有用,而是一条确认消息(例如“您已成功上传 XYZ”)。

对于redirect_tostatus 选项会覆盖默认值,例如redirect_to product_path(@product), status: :see_other.

【讨论】:

  • 谢谢。这是一个明确的解释。我使用了状态 303,它将我重定向到显示页面。但是这里又面临一个问题,我在显示页面的 AJAX 调用中调用上述操作,操作后返回显示更新数据的页面。但是页面没有刷新。任何线索如何解决这个问题?
  • 如果您只是“提交”<form>,您将获得正常的页面重新加载。 AJAX 设计为永远不会重新加载页面,它只是为您提供在 JavaScript 中处理的响应数据。在 JavaScript 中,您可以使用 window.location 重新加载为 GET,或使用隐藏表单来获取 POST(在 Rails 下,PUTDELETE 等通过其特殊的 _method 表单参数)。 HTTP 重定向使用 Location 标头,因此您可以在 JavaScript 中检索它(但请务必检查 4XX 或 5XX 错误响应!)
  • 谢谢。我已经在做 window.location.reload。当用户单击删除按钮时,它会在几秒钟后重新加载(因为它等待 ajax 调用完成执行:(。好的。无论如何谢谢
【解决方案2】:

如果你想重定向到显示页面,你可以做redirect_to @products。它将像 GET /products/123456 一样处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多