在Rails中,example.com/controller和example.com/controller/有什么区别?

4
我有一个PostsController,虽然对于示例不是必要的,但在我粘贴片段时会有帮助。我正在使用current_page?来确定显示的是哪个页面,这正如其名所示。但我得到了一些看起来奇怪的结果。
如果我访问/posts和/posts/,current_page?将返回不同的答案。
作为一个测试,在我的控制器的索引视图中,我只是简单地调用了:
current_page?(:action => 'index')

如果我访问 /controller(没有斜杠),current_page? 将返回 true。然而,如果我访问 /controller/,它将返回 false。
查看日志发现,实际上两者都会触发同一个操作。
Processing PostsController#index (for 127.0.0.1 at 2009-08-11 18:28:12) [GET]
  Parameters: {"action"=>"index", "method"=>:get, "controller"=>"posts"}

该操作对两者产生相同的结果,这是可以预料的。
我正在使用Rails 2.3.2和此票据似乎是唯一接近的内容。唯一的评论者认为current_page应该“考虑到如果两个URL都引用相同的RESTful对象,则将它们视为同一页面”。
感谢您对此的任何见解。
1个回答

4

Rails路由将容忍尾随斜杠,但当你使用url_for(使用标准路由)传递:action => 'index', :controller => 'posts'时,它不会生成尾随斜杠。

根据文档所述,current_page?只是从传递的参数生成一个URL,然后将其与当前请求的URL字符串进行比较。由于这个生成的URL将没有尾随斜杠,因此当当前URL为/controller时,它将返回true,而当为/controller/时,它将返回false。

有几种方法可以解决您的问题:

  • 比较参数而不是生成的URL
  • 从/controller/重定向到/controller。如果您进行页面缓存等操作,这实际上是一个好主意,也有助于SEO
  • 我相信总有其他方法:)

这很有道理。可能应该检查一下current_page的来源?非常感谢! - theIV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接