Meus pontos de vista Rails e controladores estão repletas redirect_to
, link_to
e form_for
chamadas de método. Às vezes link_to
e redirect_to
são explícitos nos caminhos que estão vinculando (por exemplo link_to 'New Person', new_person_path
), mas muitas vezes os caminhos estão implícitos (por exemplo link_to 'Show', person
).
Eu adiciono alguma herança de tabela única (STI) ao meu modelo (por exemplo Employee < Person
), e todos esses métodos são interrompidos para uma instância da subclasse (por exemplo Employee
); quando o rails é executado link_to @person
, ele erro com undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. O Rails está procurando uma rota definida pelo nome da classe do objeto, que é empregado. Essas rotas de funcionários não são definidas e não há um controlador de funcionários, portanto, as ações também não são definidas.
Esta pergunta já foi feita antes:
- No StackOverflow , a resposta é editar todas as instâncias de link_to etc em toda a sua base de código e indicar o caminho explicitamente
- No StackOverflow novamente, duas pessoas sugerem o uso
routes.rb
para mapear os recursos da subclasse para a classe pai (map.resources :employees, :controller => 'people'
). A resposta principal nessa mesma pergunta de SO sugere a conversão de tipos de todos os objetos de instância na base de código usando.becomes
- Ainda outra no StackOverflow , a resposta principal está no campo Do Repeat Yourself e sugere a criação de andaimes duplicados para cada subclasse.
- Aqui está a mesma pergunta novamente na SO, onde a resposta principal parece estar errada (a mágica do Rails simplesmente funciona!)
- Em outras partes da web, encontrei este post no qual a F2Andy recomenda editar o caminho em qualquer parte do código.
- Na postagem do blog Herança de tabela única e rotas RESTful no Logical Reality Design, é recomendável mapear os recursos da subclasse para o controlador da superclasse, como na resposta SO 2 acima.
- Alex Reisner tem um post de Herança de tabela única no Rails , no qual defende o mapeamento dos recursos das classes filho para a classe pai
routes.rb
, pois isso apenas captura falhas de roteamento delink_to
eredirect_to
, mas não deform_for
. Portanto, ele recomenda adicionar um método à classe pai para fazer com que as subclasses mentam sobre a classe. Parece bom, mas o método dele me deu o erroundefined local variable or method `child' for #
.
Portanto, a resposta que parece mais elegante e tem o maior consenso (mas não é tudo o que elegante, nem que muito consenso), é a adicionar os recursos para o seu routes.rb
. Exceto que isso não funciona form_for
. Eu preciso de alguma clareza! Para destilar as opções acima, minhas opções são
- mapeie os recursos da subclasse para o controlador da superclasse em
routes.rb
(e espero não precisar chamar form_for em nenhuma subclasse) - Substituir métodos internos dos trilhos para fazer com que as classes se encontrem
- Edite todas as instâncias no código em que o caminho para a ação de um objeto é invocado implicitamente ou explicitamente, alterando o caminho ou convertendo o objeto em tipo.
Com todas essas respostas conflitantes, preciso de uma decisão. Parece-me que não há uma boa resposta. Isso é uma falha no design dos trilhos? Em caso afirmativo, é um bug que pode ser corrigido? Ou, se não, espero que alguém possa me esclarecer sobre isso, guiar-me pelos prós e contras de cada opção (ou explicar por que isso não é uma opção) e qual é a resposta certa e por quê. Ou existe uma resposta certa que não estou encontrando na web?