我正在我的控制器动作中重定向这样的事情
format.html { redirect_to product_path(@product) }
将我带到PUT /products/123456
但我想去GET /products/123456
。
有人可以解释一下为什么会这样。我应该使用什么样的辅助方法来处理GET请求?
根据文档product_path(@product)
,所有GET, PUT/PATCH
和DELETE.
我找不到任何传递类似
的选项format.html { redirect_to product_path(@product) }, method: :get
在redirect_to
api doc中。请解释我如何实现这一目标。感谢
更新
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
答案 0 :(得分:0)
使用redirect_to
(默认HTTP 302 Found
)的重定向应保留该方法,但并非总是如此。如果您想强制使用303 See Other
,则可以使用GET
。
请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302
即使规范要求在执行重定向时不要改变方法和正文,也不是所有的用户代理都符合这里,你仍然可以在那里找到有缺陷的软件。因此,建议仅将302代码设置为GET或HEAD方法的响应,并使用307临时重定向,因为在这种情况下明确禁止方法更改。
如果您希望将方法更改为GET,请使用303另请参阅。当您想要回答不是上传资源的PUT方法,而是确认消息(例如"您已成功上传XYZ")时,这非常有用。
对于redirect_to
,status
选项会覆盖默认值,例如redirect_to product_path(@product), status: :see_other
。
答案 1 :(得分:-1)
如果要重定向到显示页面,可以redirect_to @products
。将像GET / products / 123456一样处理。