Rails中example.com/controller和example.com/controller/之间有什么区别?

我有一个PostsController,对于这个例子不是必不可少的,但是当我粘贴代码片段时,它会有用,我正在使用current_page? 顾名思义,要找出正在显示的页面。 我得到了看似奇怪的结果。

current_page? 如果我去/posts vs. /posts/将返回不同的答案。

作为测试,在我的控制器的索引视图中,我只是在调用

 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对象”。

感谢您对此的任何见解。

rails routing将容忍尾部斜杠,但是当你传递:action => 'index', :controller => 'posts' url_for :action => 'index', :controller => 'posts'url_for (带标准路由)时,它不会生成。

根据current_page? 文档它只是从传递的参数生成一个url,然后比较当前的请求url 字符串 。 因为这个生成的url不会有尾部斜杠,当当前url是/ controller时它将返回true,而当/ controller /时它将返回false

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

  • 比较params,而不是生成的url
  • 从/ controller /重定向到/ controller。 如果您也为SEO进行页面缓存等,这实际上是一个好主意
  • 我确信还有其他方法一如既往:)