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

时间:2009-08-11 22:37:59

标签: ruby-on-rails url-routing

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

如果我转到current_page?/posts

/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,this ticket是唯一看起来很接近的东西。唯一的评论者认为current_page应“将两个URL视为同一页面,如果它们都引用相同的RESTful对象”。

感谢您对此有任何了解。

1 个答案:

答案 0 :(得分:4)

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

根据current_page? documentation它只是从传递的参数中生成一个url,然后与当前请求url string 进行比较。因为这个生成的url不会有尾部斜杠,所以当当前url是/ controller时它将返回true,而当/ controller /

时它将返回false

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

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