在Rails中获取STI类基类的路由

pjb*_*jb3 8 ruby ruby-on-rails

假设我有一个带有3个模型的rails应用程序,Person,Place和Thing.假设Thing使用单表继承,因此有FancyThing和ScaryThing子类.然后有定义的路线map.resources :people, :places, :things.所以没有FancyThings和ScaryThings的控制器,ThingsController处理任何类型.

现在说我需要有代码,显示任何有链接的列表.如果我在我的视图中有这个代码:

<% @items.each do |item| %>
  <%= link_to item.name, item %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

如果item是Person或Place,则工作正常,polymorphic_path负责生成正确的路由.但是如果item是FancyThing或ScaryThing,这会爆炸,因为它会尝试使用fancy_thing_path,没有路由.我想以某种方式使它使用thing_path.理想情况下,Thing和/或其子类上会有一个方法以某种方式指示子类应该使用基类来生成路由.有一个优雅的解决方案吗?

Dav*_*rer 12

这样就可以了:

<% @items.map {|i| if i.class < Thing then i.becomes(Thing) else i end}.each do |item| %>
  <%= link_to item.name, item %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这使用ActiveRecord函数"变成"来对Thing基类进行Thing的所有子类的"向上转换".


Kir*_*ein 8

尝试使用

map.resources :things
map.resources :fancy_things, :controller => 'things'
map.resources :scary_things, :controller => 'things'
Run Code Online (Sandbox Code Playgroud)