使用Rails!路线中的(感叹号)

set*_*rgo 2 routes ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

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

/!/about
/!/faq
Run Code Online (Sandbox Code Playgroud)

目前,我可以pagesroutes.rb文件中使用前缀来实现此功能:

# config/routes.rb
get 'pages(/:action)' => 'pages', :as => :page
Run Code Online (Sandbox Code Playgroud)

这很好用,并生成正确的URL等。但是,如果我替换pages!,则路由失败:

# config/routes.rb
get '!(/:action)'...
Run Code Online (Sandbox Code Playgroud)

这是的输出rake routes

pages GET     /!(.:format)             {:controller=>"pages", :action=>"index"}
page GET      /!/:action(.:format)     {:controller=>"pages"}
Run Code Online (Sandbox Code Playgroud)

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

No route matches {:controller => "pages", :action => "about"}
Run Code Online (Sandbox Code Playgroud)

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

PS,如果我手动指定{:controller => :pages, :action => :about}相同错误的路由,它也会失败。

如果直接访问(/!/about)会呈现正确的页面,则PSS路线实际有效。URL助手只是不允许它实际创建链接:(

Mat*_*udy 5

取自RFC3986统一资源标识符:通用语法

2.2 Reserved Characters

  reserved    = gen-delims / sub-delims

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

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

因此,您不应!在路径中包含。

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

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

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

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

host = "twitter.com"
path = "/"
hash = "#!/exampleUser"
Run Code Online (Sandbox Code Playgroud)