【问题标题】:How to deal with routes that don't respond to GET in Rails?如何处理 Rails 中不响应 GET 的路由?
【发布时间】:2012-03-03 17:27:34
【问题描述】:

我有一个如下所示的单例路由:

resource :avatar, :only => [:edit, :update]

当用户编辑头像时,他们会转到 /avatar/edit 以查看表单,当他们保存时,他们会通过 put 请求发送到 /avatar,然后重定向回 /avatar/edit。当我们收到对 /avatar 的 GET 请求时会发生什么?

目前无法识别路线并返回通用 404。但是这种情况发生的频率比它应该的要多,所以我觉得我们应该做点什么。我很想添加一个:

get "/avatar" => redirection("/avatar/edit")

有什么理由不这样做?这样做有什么危险吗?

我不确定发生此错误的所有原因,但我知道一些:

  • 有一个错误,所以不是重定向,而是在 put 路由中再次向用户显示编辑表单,但随后,用户重新使用了 url,而不是重新提交(在 url 中按 enter字段、复制和粘贴、书签等)。

  • 此时用户决定更改区域设置(经常发生,因为错误消息是人们第一次真正需要理解网站,因此他们决定将语言切换为他们理解的语言)当然会在同一个 URL 中生成一个 get。

我现在有一个简单的重定向在第二种情况下不是最好的,因为错误丢失了,但至少它比 404 好。

【问题讨论】:

  • 您无法通过 grep 访问日志来找出人们收到 404 的原因?我经常看到机器人试图点击这些页面,而是为它们永久呈现移动,以便该页面脱离索引。
  • @phoet 没有页面被移动到这里,我真的不在乎找出某人得到 404 的所有原因。没有指向这些页面的链接,所以人们到达他们会做一些不寻常的事情,因此,没有提供有用的 http 引荐来源网址,因此查看日志不会对他们到达该页面的原因有太多了解。

标签: ruby-on-rails rest routes


【解决方案1】:

与这条路线的部分混淆是它是复数但指的是单例。你有机会只使用“化身”吗?如果我去路线“/avatars”,我会期待一个头像列表。如果它是单数,那么我希望“/avatar”可以查看头像。我还认为这在像“/avatar.jpg”这样会响应头像图像的路线中可能很有用。但是,如果您的规范定义了对节目没有用处并且总是要编辑,请尝试:

get "/avatars" => "avatars#edit"

或单数

get "/avatar" => "avatars#edit"

【讨论】:

  • 我使用复数是因为我记得在 Rails 文档中读到我不应该使用单数。我认为即使使用单数也会存在问题,因为我没有任何展示视图。我更新了答案以消除这种混乱(我将对我的代码做同样的事情)。
  • 您运行该操作而不是重定向的任何原因?
  • @J.PabloFernández 我正在路由而不是重定向,因为它节省了返回客户端的行程。现在,当在路由中引入重定向而不是在控制器中引入重定向时,这可能已经改变,但我认为它的功能相同。路由更好,因为我们没有更改任何信息。但是,网址不会更改。
  • @J.PabloFernández 我认为这里的重定向没有任何问题。在我看来,如果您总是想要编辑而不显示,那么显示路线应该转到编辑。人们将其放入浏览器这一事实表明,编写显示路线很直观。
  • 我之前有过这样的对话......关于在显示操作中显示编辑表单。似乎很多人认为它违反了 RESTful 约定。我不知道。如果您提供的不仅仅是 HTML,那么它将被破坏(html show 与 json show 不同)。我选择重定向而不是仅仅提供内容的原因是为了避免在两个不同的 URL 下提供相同的内容。
猜你喜欢
  • 1970-01-01
  • 2013-08-27
  • 2021-03-24
  • 2022-11-28
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多