link_to如何决定在控制器中调用哪个动作?

时间:2013-07-12 00:35:29

标签: ruby-on-rails

我正在关注rubyonrails.org上的教程(我假设它是关于rails 4的)

在这一行: <%= link_to "My Blog", controller: "posts" %>

rails如何决定从posts_controller调用哪个动作?

它等同于此吗? <%= link_to 'My Blog', posts_path %>

如果是的话,何时使用哪个?

3 个答案:

答案 0 :(得分:3)

<%= link_to "My Blog", controller: "posts" %><%= link_to 'My Blog', posts_path %>都是等效的,生成:<a href="/posts">My Blog</a>

也就是说,第二个<%= link_to 'My Blog', posts_path %>是首选方法,因为它是面向资源的。请参阅link_to文档的示例部分。

第一个示例<%= link_to "My Blog", controller: "posts" %>是一种更古老的参数样式,但如果您将非标准操作映射到自定义URL,则它可以在与操作结合使用时证明是有用的。

答案 1 :(得分:2)

我认为当没有明确提供任何操作时,路由器默认为index操作。

所以是的,在这种情况下,这两个是等价的:

link_to 'My Blog', controller: 'posts'
link_to 'My Blog', posts_path

答案 2 :(得分:1)

实际上,两者都会产生<a>href /posts属性,<%= link_to 'My Blog', posts_path %>属性。

posts_path是一条资源丰富的路由,遵循Rails定义的RESTful约定。 index是指向posts_controller.rb posts行为的路线。此路径很可能由# config/routes.rb resources :posts # rake db:migrate posts GET /posts(.:format) posts#index POST /posts(.:format) posts#create new_post GET /posts/new(.:format) posts#new edit_post GET /posts/:id/edit(.:format) posts#edit post GET /posts/:id(.:format) posts#show PUT /posts/:id(.:format) posts#update DELETE /posts/:id(.:format) posts#destroy 的资源路由声明定义:

<%= link_to "My Blog", controller: "posts" %>

相反,action不使用命名路由,而是传递专门路由到控制器的参数。由于没有传递index,因此链接助手会构建一条指向默认操作的路由 - <%= link_to 'My Blog', controller: 'posts' %> # /posts <%= link_to 'My Blog', controller: 'posts', action: 'new' %> # /posts/new <%= link_to 'My Blog', controller: 'posts', action: 'edit', id: post_id %> # /posts/post_id/edit <%= link_to 'My Blog', controller: 'posts', action: 'show', id: post_id %> # /posts/post_id 操作。鉴于这种路由模式,以下列表近似于上面的命名资源路由:

posts_path

首选哪种方法?

在两个选项之间,最好使用指定的{{1}}路由。通过使用命名路由,您可以保持代码DRY并避免在路由更改时与链接断开相关的问题,反之亦然。此外,命名路由有助于确保URL格式正确,链接使用正确的HTTP请求方法。