所以这是一口气。
让我们假设你是一个汽车制造商,你想要一个webapp的东西。该webapp的一部分用于您的设计师协作他们的设计。你可以设计汽车,卡车和suv。假设您继承了更新此内容,并且先前的开发人员决定使用单表继承作为设计模式。您阅读了STI并且您同意所使用的设计模式是正确的,但您想要重构一堆控制器和视图,因为它们实际上是相同的。
您继承的模型如下所示:
class Design < ActiveRecord::Base
class DesignVersion < ActiveRecord::Base
class DesignCar < Design
class DesignCarVersion < DesignVersion
假设您的SUV和卡车设计/设计版本的车型遵循与此处规定的车型相同的模式。还假设自应用程序工作以来已经设置了适当的关系,它只是有一些你想要干的冗余代码。
您最初开始为汽车,汽车设计,卡车,卡车设计等设置控制器。因此,您可以阅读带有单个控制器的STI,以及STI的路由。因此,您可以创建Designs和DesignVersions控制器(以匹配您的Design和DesignVersion基础模型),并在您的路线中提供如下内容:
resources :cars, :controller => "designs", :type => 'DesignCar' do
resources :car_versions, :controller => "design_versions", :type => 'DesignCarVersion'
member do
post 'approve'
#various other things besides new, show, etc
end
end
end
这有助于生成诸如new_design_car_car_versions_path,approve_design_car_car_versions_path等路线。假设您对卡车和SUV也这样做。你做一个耙路线,看看你的路线 - 路线和你以前做过的路线相同
resources :cars
resources :car_versions
member do
post 'approve'
end
end
end
所以一切看起来都不错。你创建一个真正基本的视图,只列出设计(所以,如果你去/汽车,你只看到汽车设计),当你看到/汽车,/卡车等所有看起来都很好。所有你看到的是具体的设计类型。然后你开始添加旧的_path并重构它们是通用的而不是特定的。
没问题,你想。我只会使用polymorphic_path!
这就是我遇到问题的地方。
从config / routes.rb生成的路由生成为approve_design_car_car_versions_path。等效的polymorphic_path生成为approve_design_car_design_car_versions_path。当我尝试查看/ cars的页面(列出每个设计,然后在其下,有关各种版本的一些数据,包括指向设计的特定版本的链接),正如人们所预料的那样,它会失败,因为“approve_design_car_design_car_versions_path”不会存在。
让我们假设即使DesignCar和DesignCarVersion对于模型名称看起来很笨拙,我们也有一个用于webapp的另一部分的Car模型。结果,我们不得不区别对待。对于这个例子,CarDesign和CarDesignVersion可能更有意义,但在我之后建模的问题中,我实际拥有的东西(我在这里用DesignCar替换)更有意义。
我尝试过的事情:
很多阅读。我首先想到的可能是polymorphic_url不是我想要的,所以我尽力尝试阅读如何为STI生成路由。不幸的是,我发现的大多数答案都不包括:类型的东西,或者不包括像我这样的嵌套路线。
然后我想也许我可能真的想从STI改为多态。我看了一个较旧的Rails Cast,对它进行了一些阅读,但结果表明STI确实是正确的。
然后我想“好吧,我只是指定路由的名称,无论多态产生什么,这应该有效”,所以我做了类似下面的事情:
resources :cars, :controller => "designs", :type => 'DesignCar' do
resources :car_versions, :controller => "design_versions", :type => 'DesignCarVersion'
member do
post 'approve', :as => 'approve_design_car_car_versions'
end
end
end
当我做一个佣金路线时,那就变成'approve_design_car_car_versions_design_car_versions'
那么,我需要做些什么来使得生成的路由与我交给汽车和car_version时生成的polymorphic_path相匹配?不使用polymorphic_path?修复我的路线?回到我所有孩子的控制器,即使这会造成很多重复吗?
我怀疑它与模型上的反射有关,因为polymorphic_path返回模型名称和反射?正在为路由生成所做的是出于某种原因返回其他内容。但是,我很困惑为什么会这样,如果这不是一个错误(我假设这不是一个错误,我只是做错了)或者我错过了一个关键值我应该是经过某个地方。我还是比较新的轨道,所以我相信这个错误最有可能在于我(约1。5年)。
提前感谢您的时间。
答案 0 :(得分:0)
因此,在继续阅读(并决定从外部页面重新读取Rails路由,因为我在几个月内没有这样做)之后,我遇到了以下解决方案:
resources :cars, :controller => "designs", :type => 'DesignCar' do
resources :car_versions, :controller => "design_versions", :type => 'DesignCarVersion', :as => 'design_car_version' do
member do
post 'approve'
end
end
end
请注意,在上面的问题中,我错过了'do'on:car_versions,但它确实存在于代码中。解决方案是添加:关于资源级别,而不是每个成员。
如果有更好的方式,我会全力以赴。