【问题标题】:What's the difference between example.com/controller and example.com/controller/ in Rails?Rails 中的 example.com/controller 和 example.com/controller/ 有什么区别?
【发布时间】:2009-08-11 22:37:59
【问题描述】:

我有一个 PostsController,对示例来说不是必需的,但在我粘贴 sn-ps 时会有所帮助,并且我使用 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,this ticket 是唯一看起来很接近的东西。唯一的评论者认为 current_page 应该“如果两个 URL 都引用同一个 RESTful 对象,则认为它们是同一个页面”。

感谢您对此的任何见解。

【问题讨论】:

    标签: ruby-on-rails url-routing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是有道理的。应该检查一下 current_page 的来源?非常感谢!
    猜你喜欢
    • 2018-12-31
    • 2010-12-25
    • 2017-09-29
    • 2011-03-23
    • 2018-05-30
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多