为什么具有绝对url的link_to在技术上被认为优于目标控制器操作



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

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

如果我在say:/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语法而不是后者的技术原因是什么

"你做错了":p

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

示例:你的路线文件中有这个:

    resources :user_orders

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

    resources :user_orders, controller: "orders"

您现有的链接将继续工作!(此外,你可以添加一个"订单"资源,将事情转移到新方案中)

还有一些巧妙的东西,比如命名链接:

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

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

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

不,不是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方法仍然映射到我的config/routes.rb中新修改的行,因为路由名称相同。通过更明确地为每个link_to指定控制器/操作,您必须遍历每个链接并手动更新它以反映新的controller: :uris控制器。

阅读rails指南中的命名路线

相关内容

最新更新