Rails' link_to 是如何工作的?

How does Rails' link_to work?

来自docs

link_to "Profile", profile_path(@profile)
# => <a href="/profiles/1">Profile</a>
link_to "Profile", @profile
# => <a href="/profiles/1">Profile</a>

这里发生了很多事情。首先,有为 Profile 资源生成的方法 #profile_path。这些类型的方法一直在产生。

那么在第二个例子中,省略了profile_path方法。

同样来自文档,link_to 的方法签名:

link_to(body, url_options = {}, html_options = {})

这里也发生了很多事情。从ruby的角度来看,link_to是一个取三个positional arguents, two of which are optional的方法。但最后两个是散列,所以区分两者有点棘手,除非我们明确使用卷曲。所以我们需要注意是否尝试设置 url_optionshtml_options

您可以在您的应用程序根目录中通过 运行 rake routes 查看您的所有路由。示例:

                      Prefix Verb      URI Pattern                                                             Controller#Action
                negotiations GET       /negotiations(.:format)                                                 negotiations#index
                             POST      /negotiations(.:format)                                                 negotiations#create
             new_negotiation GET       /negotiations/new(.:format)                                             negotiations#new
            edit_negotiation GET       /negotiations/:id/edit(.:format)                                        negotiations#edit
                 negotiation GET       /negotiations/:id(.:format)                                             negotiations#show
                             PATCH     /negotiations/:id(.:format)                                             negotiations#update
                             PUT       /negotiations/:id(.:format)                                             negotiations#update
                             DELETE    /negotiations/:id(.:format)                                             negotiations#destroy

因此,您可以使用这些前缀中的任何一个,并在末尾添加 _path_url。我现在不会详细介绍 _url,因为它与您的问题没有直接关系。

Rails 能够通过其模型将您传入的任何对象映射到 link_to。它实际上与您使用它的视图无关。它知道 Profile class 的实例在生成 URL 时应该映射到 /profiles/:id 路径.这样做的先决条件是您使用 resources 标记在 routes.rb 中声明 Profile 路由,例如resources :profiles.

url_options 用于传递 URL 或其任何选项。它通常涉及 Rails 必须先执行才能呈现 HTML 的魔法。

html_options 用于将设置传递给 link 标签本身。实际路径本身在 url_options 中,而 idclass 等都在 html_options 中。这是一个例子:

link_to "Profile", @profile, class: 'button'

文档是这方面的重要参考。查看它们:http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to