在Rails中为已挂载的引擎强制执行URL尾部斜杠

时间:2014-01-08 16:13:23

标签: ruby-on-rails url

我有一个名为Battalion的引擎安装到我的主机应用程序中,如下所示:

mount Battalion::Engine => '/@:site_username'

Battalion引擎在概念上与主机应用程序不同;它有单独的资产等。我遇到的问题与尾部斜杠有关。当我访问路线http://localhost:3000/@jon时,我希望被重定向到相同的路线,但使用尾部斜杠,例如http://localhost:3000/@jon/

这很重要,因为我想在用户进入引擎后使用资产的相对URL。

我知道可以应用于链接帮助程序的trailing_slash选项,但我希望在控制器级别强制执行重定向,而不是为每个链接强制执行重定向。我还阅读了blog post提供了一个很好的解决方案,但它在我的特定情况下中断,因为我在我的路线中使用了:site_username变量。

1 个答案:

答案 0 :(得分:1)

原来处理这个问题的最佳方法是对this post中的答案进行略微修改。他的建议在这种情况下并不适用,因为引擎的URL中嵌入了一个参数。这是我找到的解决方案:

在引擎的application_controller.rb中:

def ensure_trailing_slash
  redirect_to url_for(params = :trailing_slash => true), :status => 301 unless trailing_slash?
end

def trailing_slash?
  request.env['REQUEST_URI'].match(/[^\?]+/).to_s.last == '/'
end

在包含根路径的控制器中:

before_filter :ensure_trailing_slash, :only => :index