我正在关注rubyonrails.org上的教程(我假设它是关于rails 4的)
在这一行:
<%= link_to "My Blog", controller: "posts" %>
rails如何决定从posts_controller调用哪个动作?
它等同于此吗?
<%= link_to 'My Blog', posts_path %>
如果是的话,何时使用哪个?
答案 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请求方法。