【问题标题】:How to build a route that has a `#` in it?如何构建一个包含“#”的路线?
【发布时间】: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


    【解决方案1】:

    您不能在服务器上的 URL 中使用 #,它称为 Fragment Identifier,是浏览器永远不会发送到服务器的本地页内锚。

    更新

    OP 在客户端路由的评论中添加了信息。

    是的,虽然这在您的应用程序的服务器端没有意义,但您绝对可以在客户端路由中包含哈希值。现代浏览器(HTML5 支持)甚至有一个可以绑定到的 hashchange 事件,尽管因为旧版浏览器不支持它,所以您通常会为 jQuery 使用 hashchange 插件,或者也许 Angular 本身支持它。

    这个想法是,基本上浏览器可以检测到 URL 更改,并且因为 # 更改永远不会触发对服务器的请求,所以这是一种在不触发服务器请求的情况下触发客户端应用程序更改的便捷方法。

    另一个更新

    在 OP 的另一条评论之后......

    您在服务器端根本不需要做任何事情。如果您的前端人员想要使用基于 # 的 URL,例如 /authors#123 来触发该作者的客户端加载,那么他的 JS 将监听 hashchange 然后他会像GET /authors/123.json 一样向服务器发出一个常规的、不包含哈希的请求,然后使用来自该服务器的响应来更新加载页面的 HTML。

    【讨论】:

    • 谢谢。我收到了有人用 Javascript/Angularjs 开发前端的请求。他说有了这样的URL,前端使用起来会更方便(意思是更容易确定要渲染哪个作者??)。这是否敲响了警钟,他可能在谈论使用 # 的方式与我在帖子中提出的方式不同?
    • 完美,谢谢。服务器端将如何适应这种行为?因为我如何理解它,他希望我在后端包含这样一条路线。这将是包含 API/javascript 代码的视图的路由。但就像你说的,在route.rb 中创建这样的路由似乎是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2021-03-29
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多