1

Rails 的新手,所以如果在某个地方讨论过这个问题,请把我联系起来:我进行了很好的搜索,但我能找到的只是人们试图弄清楚如何使用 link_to,而不是对此评论的任何讨论:

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

in place of the older more verbose, non-resource-oriented

link_to "Profile", :controller => "profiles", :action => "show", :id => @profile
# => <a href="/profiles/show/1">Profile</a>

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

我知道后者更冗长,因此不受欢迎,但推荐前者似乎是一件奇怪的事情。

如果我有一个动作说:/blah/add,我使用以下链接链接到它:

link_to "Link", link_add_path

然后我链接到 mysite.com/link/add。这是一个硬编码的 url

如果我更改此映射到的路由,我必须更改我的代码库中的每个 link_to 实例以指向新的绝对 url。这似乎很疯狂。

但是,如果我使用以下方法链接到它:

link_to "Link", :controller => "thing", :action => "add"

然后动态确定url。如果我必须更改路径,我所做的就是编辑 config/routes.rb 并且不触及我的任何代码。这似乎是低得多的维护。

我很欣赏它比这稍微复杂一些,blah_path 变量实际上不是静态路由,实际上包含一些智能,例如应用程序基本 url,并阻止您链接到不存在的 url,但这似乎是倒退一步促进稍微不那么冗长的语法。

那么,这是怎么回事?

您会出于什么技术原因选择前者而不是后者的 link_to 语法?

4

2 回答 2

3

“你做错了”:P

不过说真的:使用命名资源,这就是为什么这很酷:

示例:您的路线文件中有此内容:

    resources :user_orders

而且您到处都在使用“user_orders_path”。然后您进行重构并决定(因为订单现在是通用的)您希望控制器被称为“订单”,但您不想破坏所有旧代码。你可以这样做:

    resources :user_orders, controller: "orders"

您现有的链接将继续有效!(另外,您可以添加“订单”资源以将内容转移到新方案中)

还有一些简洁的东西,比如命名链接:

    match 'exit' => 'sessions#destroy', :as => :logout

我还想补充一点,如果您需要使用旧的链接语法重构控制器 - 您仍然需要更改一堆控制器链接!

于 2012-08-26T03:22:30.670 回答
0

然后我链接到 mysite.com/link/add。这是一个硬编码的网址。

不,这不对。 link_add_path是 Rails 生成的一个方法,它指向你的config/routes.rb. 您可以通过运行看到这一点

rake routes | grep link_add

如果我更改此映射到的路由,我必须更改我的代码库中的每个 link_to 实例以指向新的绝对 url。这似乎很疯狂。

不,你没有。举个例子

get "link/add", as: :link_add, controller: :links, action: :add

如果我运行上述

rake routes | grep link_add

我明白了

link_add GET    /link/add(.:format)    links#add

但是,如果我将控制器的名称更改为UrisController怎么办?只需更改路线config/routes.rb

get "link/add", as: :link_add, controller: :uris, action: :add

现在你有了

link_add GET    /link/add(.:format)    uris#add

link_to' 不必更改,因为该方法link_add_path 仍然映射到 my 中新修改的行,config/routes.rb因为路由名称相同。使用更明确的方式为 each 指定控制器/操作link_to,您必须遍历每个链接并手动更新它以反映新controller: :uris控制器。

在 rails 指南中阅读有关命名路线的信息。

于 2012-08-26T03:16:28.457 回答