Rails' link_to工作?

时间:2017-02-12 21:22:31

标签: ruby-on-rails ruby link-to

来自docs

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

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

  • 这是如何运作的?
  • 我会在哪里阅读有关生成方法的文档?

然后在第二个示例中,省略了profile_path方法。

  • rails是否知道与Profile资源相关联的视图?
  • 怎么知道?

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

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

此外还有很多事情要发生。从ruby link_to的角度来看,这是一个需要三个positional arguents的方法,其中两个是optional。但最后两个是哈希,所以除非我们明确使用curlies,否则区分两者是有点棘手的。因此,我们需要注意是否尝试设置url_optionshtml_options

  • url_optionshtml_options之间的区别是什么?
  • 你何时以及为何使用每一个?
  • 你能提供一个简单的例子吗?

1 个答案:

答案 0 :(得分:2)

您可以在应用根目录中运行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类的实例应该在生成URL时映射到/profiles/:id路径。这样做的前提条件是,您使用Profile标记在routes.rb中声明resources路由,例如resources :profiles

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

html_options用于将设置传递给链接标记本身。实际路径本身位于url_options,而idclass等都位于html_options。这是一个例子:

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

文档是一个很好的参考。检查出来:http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to