Pergunta

Eu tenho uma propriedade modelo que tem subclasses usando STI,

e que eu gostaria que todos usassem o mesmo controlador com apenas diferentes visualizações parciais, dependendo da subclasse.

Property
Restaurant < Property
Landmark < Property

Funciona, exceto que não tenho certeza de como discernir a subclasse dentro do controlador para renderizar a visualização correta. Ou seja. /Restaurantes trabalha e vai para o controlador de propriedades, mas não sei dizer que eles querem a subclasse do restaurante?

map.resources :restaurant, :controller => :properties
map.resources :properties
Foi útil?

Solução

Uma maneira simples de fi o problema seria criar um sub-controlador:

class RestaurantsController < PropertiesController
end

Nas rotas, você mapearia restaurantes para o controlador de restaurantes.

Atualizar: Como alternativa, você pode tentar algo assim em seu routes.rb:

map.resources :restaurants, :controller => :properties, :requirements => {:what => :Restaurant}
map.resources :properties, :requirements => {:what => :Property}

Em seguida, você pode usar um filtro antes para verificar os parâmetros [: o quê] e alterar o comportamento de acordo.

Exemplo:

class PropertiesController < ApplicationController
  before_filter select_model

  def select_model
    @model = params[:what].constantize
  end

  def show
    @model.find(params[:id])
    ...
  end

  ...
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top