Наследование и маршрутизация одной таблицы Rails

Я реализую наследование одной таблицы, но у меня проблемы с маршрутизацией. У меня есть два класса, Гамма и Бета, и оба наследуются от Альфы. Я знаю, что если я хочу использовать Alpha в качестве контроллера, а не отдельные контроллеры для Beta и Gamma, я могу следовать инструкциям здесь за то, что ресурс по умолчанию относится к другому контроллеру.

Однако я хочу, чтобы некоторые методы обрабатывались центральным контроллером Alpha (например, редактирование и обновление), а другие методы обрабатывались контроллерами подклассов Beta и Gamma. Как я могу указать, какие методы должны быть указаны для контроллера Alpha, а какие должны оставаться для обработки Beta и Gamma?


person Kvass    schedule 21.08.2011    source источник
comment
Вы требуете, чтобы адреса были ../alpha/edit или они могут быть ../beta/edit и ../gamma/edit?   -  person dnatoli    schedule 22.08.2011
comment
Я полагаю, что в идеале я хотел бы, чтобы все они работали, но указывали на метод редактирования в альфа-контроллере.   -  person Kvass    schedule 22.08.2011


Ответы (1)


Используйте наследование с вашими контроллерами. Реализуйте свои функции редактирования и обновления в классе AlphaController, а затем наследуйте от этого класса в ваших классах BetaController и GammaController, где вы затем реализуете свои другие функции.

class AlphaController < ActionController::Base

   def edit
      ...
   end

   def update
      ...
   end

end

class BetaController < AlphaController

   def index
      ...
   end

end

Обратите внимание, что это сделает ваши URL-адреса .../beta/edit и .../beta/update.

Вы хотели бы использовать только views/alpha/edit.html.erb как частичное представление, а затем отображать страницу альфа-представления как частичное в ваших бета-/гамма-представлениях.

Помните, что даже если вы храните объекты в одной таблице Alpha, в вашей модели по-прежнему есть два класса, Beta и Gamma, и их следует рассматривать как таковые.

person dnatoli    schedule 22.08.2011
comment
Это в дополнение к изменению файла маршрутов с помощью resources :betas, :controller => "alphas" и т. д., или я не трогаю свой файл маршрутов? - person Kvass; 22.08.2011
comment
Вам не нужно трогать файл маршрутов. BetaController унаследует реализацию редактирования или обновления от AlphaController, так что при доступе к .../beta/edit это будет так, как если бы вы определили эту функцию редактирования для BetaController. - person dnatoli; 22.08.2011
comment
Хорошо, но что, если у меня есть одно представление в views/alphas/edit.html.erb, которое я хочу отображать как для бета-версии, так и для гаммы? Есть ли способ сделать это, не создавая файл в бета- и гамма-представлениях, который явно отображает страницу альфа-представления? - person Kvass; 22.08.2011
comment
@Kvass, вам нужно проверить это railscasts.com/episodes/269-template-inheritance, если вы используете рельсы 3.1 - person rubish; 22.08.2011
comment
Я использую 3.0.7 - это разница между рельсами 2 и рельсами 3 или разница 3 и 3.1? - person Kvass; 22.08.2011
comment
Обновленный ответ, чтобы отразить ваши вопросы. - person dnatoli; 22.08.2011