Rails使用! (感叹号)在路线上

时间:2012-01-08 17:59:46

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 routes

在我的应用程序中,我想在'!'下创建名为namespace的静态页面(感叹号)。例如:

/!/about
/!/faq

目前,我在pages文件中使用前缀routes.rb使其正常运行:

# config/routes.rb
get 'pages(/:action)' => 'pages', :as => :page

效果很好,并生成正确的网址等。但是,如果我将pages替换为!,则路由会失败:

# config/routes.rb
get '!(/:action)'...

以下是rake routes的输出:

pages GET     /!(.:format)             {:controller=>"pages", :action=>"index"}
page GET      /!/:action(.:format)     {:controller=>"pages"}

如您所见,Rails正在生成路由。但是,当我尝试在视图中使用任何这些命名路由时,我收到路由错误:

No route matches {:controller => "pages", :action => "about"}

具有讽刺意味的是,如果我使用任何其他符号(如@),则路由按预期工作。为什么我不能在我的路线中使用!感叹号:(。我应该在github上提出问题吗?

P.S。如果我手动指定路径{:controller => :pages, :action => :about}并且具有相同的错误,它也会失败。

P.S.S如果直接访问(/!/about),路线实际工作会呈现正确的页面。 URL助手不会让它实际创建链接:(

1 个答案:

答案 0 :(得分:5)

取自RFC3986 Uniform Resource Identifier: Generic Syntax

2.2 Reserved Characters

  reserved    = gen-delims / sub-delims

  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

因此,您不应在路径中加入!

您可能已经看过google的#!语法,可以让搜索引擎抓取ajax网络应用。

例如。 https://twitter.com/#!/exampleUser

但在这种情况下,这是一个技巧;

路径只是“/”,其余部分被视为“锚”或“哈希”

host = "twitter.com"
path = "/"
hash = "#!/exampleUser"