Разные маршруты, но использующий один и тот же контроллер для подклассов моделей в Rails
-
21-09-2019 - |
Вопрос
У меня есть свойство Model, которое имеет подклассы, использующие STI,
и я бы хотел, чтобы все использовали один и тот же контроллер только с разными частями представления в зависимости от подкласса.
Property
Restaurant < Property
Landmark < Property
Это работает, за исключением того, что я не уверен, как определить подкласс внутри контроллера для отображения правильного представления.Т. е./ restaurants работает и переходит к контроллеру свойств, но я не могу сказать, что им нужен подкласс Restaurant?
map.resources :restaurant, :controller => :properties
map.resources :properties
Решение
Простым способом решения проблемы было бы создание субконтроллера:
class RestaurantsController < PropertiesController
end
В маршрутах вы должны сопоставлять рестораны с контроллером ресторанов.
Обновить: В качестве альтернативы вы могли бы попробовать что-то подобное в вашем routes.rb
:
map.resources :restaurants, :controller => :properties, :requirements => {:what => :Restaurant}
map.resources :properties, :requirements => {:what => :Property}
Затем вы можете использовать фильтр before для проверки параметров[:what] и соответствующего изменения поведения.
Пример:
class PropertiesController < ApplicationController
before_filter select_model
def select_model
@model = params[:what].constantize
end
def show
@model.find(params[:id])
...
end
...
end