ruby on rails 路线

Posted

技术标签:

【中文标题】ruby on rails 路线【英文标题】:ruby on rails routes 【发布时间】:2011-10-26 14:15:53 【问题描述】:

我很难理解 rails 3 中的路线。我创建了两个脚手架:用户和杂志。用户可以登录,但我无法链接到杂志页面。我知道这与创建路线有关。如果我通过 URL 导航到 localhost:3000/magazines,我可以看到我创建的多本杂志以及与每本杂志关联的每个用户。我似乎无法将这些点联系起来。我想创建一个从用户页面到杂志页面的链接。我知道这是基本的,但是所有的路线文档对我来说都没有意义。非常感谢您的宝贵时间。

【问题讨论】:

你能发布你的 routes.rb 文件的相关部分吗?也许你的 rake 路由输出...... 【参考方案1】:

以前的答案中指出的资源很棒,这就是我开始的地方。我仍然提到,以防我被困在某个地方。我发现在资源中缺少的一件事是它不包括读取路由表的解释,即命令rake routes 的输出,并且需要时间将这些部分组合在一起。尽管如果您耐心地阅读整个指南,您可以将各个部分拼凑在一起。

在我的系统上,'rake routes' 给出以下输出(与resources :messages 相关的摘录)

    messages GET    /messages(.:format)            :action=>"index", :controller=>"messages"
             POST   /messages(.:format)            :action=>"create", :controller=>"messages"
 new_message GET    /messages/new(.:format)        :action=>"new", :controller=>"messages"
edit_message GET    /messages/:id/edit(.:format)   :action=>"edit", :controller=>"messages"
     message GET    /messages/:id(.:format)        :action=>"show", :controller=>"messages"
             PUT    /messages/:id(.:format)        :action=>"update", :controller=>"messages"
             DELETE /messages/:id(.:format)        :action=>"destroy", :controller=>"messages"

此表中的所有列都提供了非常重要的信息:

路线名称(第一列):这给出了路线的名称,您可以在其上附加“_url”或“_path”来派生路线的助手名称。例如,第一个是“消息”,因此您可以在视图和控制器中使用messages_pathmessages_url 作为辅助方法。查看表格,您可以知道messages_path 将生成格式为“/messages(.:format)”的路径。类似地,生成的其他路由名称是“new_message”、“edit_message”和“message”。您还可以控制naming of routes。 HTTP 动词(第 2 列):这提供了有关此路由将响应的 http 动词的信息。如果不存在,则意味着该路由将响应所有 http 动词。通常浏览器只支持“GET”和“POST”动词。 Rails 通过传递带有动词名称的参数“_method”作为值来模拟“PUT”和“DELETE”来模拟“PUT”和“DELETE”。默认情况下,链接会导致“GET”动词和“POST”中的表单提交。结合第一列,如果您将messages_path 与http "GET" 一起使用,它将匹配第一个路由,如果您将它与"POST" 一起使用,它将匹配第二个路由。需要注意的是,同一个 url 不同的 http 动词可以映射到不同的路由。 URL 模式(第 3 列):它就像一个有限的功能正则表达式,具有自己的语法。 ":id" 的行为类似于(.+) 并捕获参数"id" 中的匹配项,因此您可以执行params[:id] 之类的操作并获取捕获的字符串。大括号() 表示该参数是可选的。您也可以在 helpers 中传递这些参数来生成相应的路由。例如,如果您使用 message_path(:id => 123) 将生成输出“/messages/123”。 此路由的位置(第 4 列):此列通常告诉控制器和相应的操作将处理与此路由匹配的请求。如果您定义了任何约束,则此处可能会包含其他信息。

因此,如果“localhost:3000/magazines”是您想要的页面,您应该检查 url 模式为“/magazines(.:format)”的路由表,并自行分析以找出您需要的内容。如果您刚刚开始使用 Rails,我建议您从上到下阅读整个 guide。

(在这里写这一切可能有点矫枉过正,但由于这些信息无法以统一的方式获得,我遇到了很多问题。一直想把它写出来,终于写出来了。我希望它可以在@ 987654323@ 在单独的部分中。)

【讨论】:

【参考方案2】:

这是对路线的一个非常好的总结:Rails Routing from the Outside In。

【讨论】:

【参考方案3】:

怎么样:

<%= link_to "magazines", magazines_path %>

您应该了解仅由脚手架创建的所有路由。这很简单,并在 Rails 指南中进行了解释。

详情如下:http://guides.rubyonrails.org/routing.html#paths-and-urls

【讨论】:

【参考方案4】:

您可能还想查看这些 RailsCasts:

http://railscasts.com/episodes/203-routing-in-rails-3,

http://railscasts.com/episodes/231-routing-walkthrough,

http://railscasts.com/episodes/232-routing-walkthrough-part-2

还有这些页面:

http://edgeguides.rubyonrails.org/routing.html

http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

http://markconnell.co.uk/posts/2010/02/rails-3-routing-examples

【讨论】:

【参考方案5】:

除了其他人已经说过的之外,还有一些事情:

magazines_path 是最有可能指向索引页面的链接名称。

<%= link_to "Magazines", magazines_path %>

所以这应该可以解决问题。但是如果你想查看路由,我建议你运行rake routes,它将列出 Rails 正在考虑的任何有效路由名称。如果您想了解它们是如何使用的,请查看您的脚手架的视图页面。比如app/views/magazines/show.html.erb,底部可能有这样的东西:

<%= link_to 'Edit', edit_magazine_path(@magazine) %> |
<%= link_to 'Back', magazines_path %>

编辑链接转到存储在@magazine 中的杂志的edit 页面(/magazines/[ID]/edit),返回链接转到索引页面(/magazines/)。单个杂志的显示页面为magazine_path(@magazine),新路径为new_magazine_path(@magazine)

您绝对应该查看其他人发布的资源——Rails 路由很灵活但非常“神奇”——但无论如何,这应该有助于为您提供一些背景信息。

此外,这应该是自动生成的,但我认为大多数人都假设您的 config/routes.rb 包含以下内容:

My::Application.routes.draw do
  resources :magazines
  resources :users
  # or the above combined as resources :magazines, :users
end

这就是告诉 Rails 为特定资源构建索引、新建、编辑、显示、创建、更新、销毁的基本路线。

【讨论】:

【参考方案6】:

到目前为止,我发现的关于路线的最佳解释是 Obie Fernandez(Hash Rocket 的创始人)的 The Rails 3 Way。

【讨论】:

以上是关于ruby on rails 路线的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?

如何在 ruby​​ on rails 中更改路线?

Ruby on Rails - 如何为同一操作添加第二条路线?

Ruby on Rails:视图更改后,网站未更新

如何从 0 开始学 Ruby on Rails

Ruby on Rails 和 Datatables.net