Получить маршрут для базового класса класса STI в Rails - PullRequest
8 голосов
/ 31 марта 2009

Скажем, у меня есть приложение для рельсов с 3 моделями: Персона, Место и Вещи. Скажем, в Thing используется наследование одной таблицы, поэтому есть подклассы FancyThing и ScaryThing. Тогда есть маршруты, определенные с map.resources :people, :places, :things. Таким образом, для FancyThings и ScaryThings нет контроллеров, ThingsController обрабатывает оба типа.

Теперь скажите, что мне нужен код, который показывает список всего, на что есть ссылки. Если у меня есть этот код на мой взгляд:

<% @items.each do |item| %>
  <%= link_to item.name, item %>
<% end %>

Если предметом является Персона или Место, это прекрасно работает, polymorphic_path заботится о создании правильного маршрута. Но если элемент FancyThing или ScaryThing, это взрывается, потому что он попытается использовать fancy_thing_path, для которого нет маршрута. Я хочу как-то заставить его использовать thing_path. В идеале в Thing и / или его подклассах должен быть метод, который как-то указывает, что подклассы должны использовать базовый класс для генерации маршрута. Есть ли элегантное решение для этого?

Ответы [ 3 ]

12 голосов
/ 21 сентября 2009

Это поможет:

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

При этом функция ActiveRecord «становится» для «поднятия» всех подклассов Thing в базовый класс Thing.

8 голосов
/ 13 апреля 2009

Попробуйте использовать

map.resources :things
map.resources :fancy_things, :controller => 'things'
map.resources :scary_things, :controller => 'things'
0 голосов
/ 13 мая 2009

У меня нет правильного ответа, но, по крайней мере, я могу решить эту проблему, используя не сухой код:

map.resources: вещи,: has_many =>: вещи map.resources: fancy_things,: controller => 'things',: has_many =>: stuffs map.resources: scary_things,: controller => 'things',: has_many =>: stuffs

Надеюсь, что проблема скоро будет исправлена, так как я бы хотел, чтобы fancy_things управлял только: контроллером вещей. Используя эти маршруты, вы получите такие URL-адреса, как: / fancy_things / 1, тогда как вы, возможно, захотите / things / 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...