【发布时间】:2016-05-07 14:01:21
【问题描述】:
如何构建带有标签 (#) 的路线?我创建了路线
get 'authors/#/:id' => 'authors#show
但这会生成路线
GET /authors/%23/:id(.:format)
所以它有%23 # 应该在哪里。
【问题讨论】:
标签: ruby-on-rails angularjs ruby-on-rails-4 routes
如何构建带有标签 (#) 的路线?我创建了路线
get 'authors/#/:id' => 'authors#show
但这会生成路线
GET /authors/%23/:id(.:format)
所以它有%23 # 应该在哪里。
【问题讨论】:
标签: ruby-on-rails angularjs ruby-on-rails-4 routes
您不能在服务器上的 URL 中使用 #,它称为 Fragment Identifier,是浏览器永远不会发送到服务器的本地页内锚。
OP 在客户端路由的评论中添加了信息。
是的,虽然这在您的应用程序的服务器端没有意义,但您绝对可以在客户端路由中包含哈希值。现代浏览器(HTML5 支持)甚至有一个可以绑定到的 hashchange 事件,尽管因为旧版浏览器不支持它,所以您通常会为 jQuery 使用 hashchange 插件,或者也许 Angular 本身支持它。
这个想法是,基本上浏览器可以检测到 URL 更改,并且因为 # 更改永远不会触发对服务器的请求,所以这是一种在不触发服务器请求的情况下触发客户端应用程序更改的便捷方法。
在 OP 的另一条评论之后......
您在服务器端根本不需要做任何事情。如果您的前端人员想要使用基于 # 的 URL,例如 /authors#123 来触发该作者的客户端加载,那么他的 JS 将监听 hashchange 然后他会像GET /authors/123.json 一样向服务器发出一个常规的、不包含哈希的请求,然后使用来自该服务器的响应来更新加载页面的 HTML。
【讨论】:
# 的方式与我在帖子中提出的方式不同?
route.rb 中创建这样的路由似乎是不可能的。