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指南中的命名路线