在我的应用程序中,我想在'!'下创建名为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助手不会让它实际创建链接:(
答案 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"