【问题标题】:What does .:format mean in rake routes.:format 在 rake 路由中是什么意思
【发布时间】:2013-12-17 16:29:09
【问题描述】:

我输入 rake routes 并得到一堆这样的网址 - /articles/:id(.:format)

我的问题是 - .:format 是什么意思? Rails Guides Routing 文章并不清楚,在 StackOverflow 或 google 上没有其他有用的匹配 .:format。有一个类似的格式是/:controller(/:action(/:id(.:format))),我也不明白。

谢谢

编辑后续问题 -

如果我只想路由 HTML 页面。最好的做法是在路由中指定类似 .:html 的内容还是使用 .:format 并为 format.html 编写一个 respond_to 块?在后一种情况下会忽略所有其他格式吗?

【问题讨论】:

  • 就像对未来的说明:Google 经常从搜索词中删除符号(即使您将搜索用引号括起来)。您可以使用 symbolhound.com 作为替代方案,它可以方便地在搜索词中包含符号字符。我与 SymbolHound 没有任何关系,只是在 Google 无法方便地完成工作时不时使用它。

标签: ruby-on-rails rake


【解决方案1】:

这是所请求文件的格式。例如,如果你想要一张图片,你可能会在请求中有一个文件扩展名——例如,example.com/example_image.png 会给你png 的格式。然后将其包含在请求中,以便您可以根据请求的格式更改响应类型,需要。

对于一个用法示例,您可能希望允许将资源表示为 pdf、纯 html 页面和 json - 您可能会编写如下内容:

respond_to do |format|
  format.html { ... }
  format.pdf { ... }
  format.json { ... }
end

然后在各自的格式下进行单独的渲染调用。


编辑:

GET /:controller(/:action(/:id(.:format))) :controller#:action的解释-

首先,关于格式化。括号表示给定的数据是可选的。冒号意味着它在相应 URL 中找到的任何字符串都应该在 params 哈希中传递给控制器​​。

这本质上是一个通配符匹配器,它将尝试将大量请求匹配到控制器。例如,假设这是您唯一的路线,并且有人试图获取“/用户”。这会将users 映射到UsersController,默认情况下在其中调用/渲染index。如果有人得到users/new,控制器内的new 动作将被调用。如果idformat 被调用,它们也会被传递给控制器​​。

【讨论】:

  • @toolz 你知道如何在 URL 中指定特定数据类型的有效性吗?比如说我想only 路由 HTML 页面。最好的做法是在路由中指定.:html 之类的东西还是使用.:format 并为format.html 编写一个respond_to 块?在后一种情况下是否会忽略所有其他格式?
  • 如果您不指定格式,则对不同格式的请求将被视为无效(如果未提及其他内容,则默认为 html)。因此,如果您不想担心其他数据类型,则不必担心 - 假设您在视图中有一个适当命名的模板,如果您只是在做 html 响应,您可以完全忘记格式。根据我的经验,路由中很少指定格式 - 通常仍会调用控制器操作,如果您不指定如何响应请求的格式,则会发生错误。
  • 除了 Bubbles 的回答:在 :blah 符号被有效值替换后,您在 'rake routes' 之后获得的 url 是绝对可路由的,并且 url 模板中的括号意味着值可以省略。但如果不是,则使用明确声明的值:例如说我想强制文章控制器返回 javascript 模板(由“format.js”块生成)。以下网址将使其成为:/articles/1.js
  • @RoaringStones, @Bubbles 谢谢 - 我想知道你是否也可以解释这条路线(这是我输入 rake routes 时的最后一个条目 - 我的 routes.rb 文件中有一个条目,一个 @ 987654337@. 这里是 - GET /:controller(/:action(/:id(.:format))) :controller#:action
  • 我更新了我的答案,让您对那里发生的事情有一个基本的了解。
【解决方案2】:

.:format 匹配 mime 类型。

例如,如果您发送一个查找 index.html 的请求,格式会将 'html' 捕获为 :format。

然后在您的控制器中,它将被类似的东西处理

respond_to do |format|
  format.html { #do something like redirect in here }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2022-01-28
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多