Superar un método de mezcla de núcleos de Rails y seguir siendo capaz de llamar al método antiguo
-
06-07-2019 - |
Pregunta
El título correcto es confuso, te diré mi problema primero:
el método polymorphic_url
se cambió en Rails 2.2.1 para incluir alguna funcionalidad adicional que necesito. Sin embargo, quiero que la aplicación aún funcione en versiones anteriores de Rails, así que quise parchear el comportamiento 2.2.1 si se está ejecutando una versión anterior de Rails.
alias_method_chain
para el rescate, ¿verdad? No puedo hacerlo funcionar.
def polymorphic_url_with_compat(*args)
whatever...
return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat
Ahora primero intenté poner esto en el helper - alias_method_chain
falla porque polymorphic_url
no está definido para entonces.
Así que moví el mismo código en el controlador, y no falla, pero se ignora.
Luego intenté parchearlo en ApplicationController :: Base con un complemento: polymorphic_url
aún no está definido.
polymorphic_url
se define en el módulo ActionController :: PolymorphicRoutes. Realmente no sé cuándo / dónde se mezcla con el controlador / vista.
¿Cómo puedo ajustar este método de la manera que quiero?
Solución
Antes de continuar, ¿está seguro de que polymorphic_url existía en la versión de Rails anterior a 2.2.1?
Su código es correcto en su mayoría, se olvida de llamar a la versión original del método. A la que se le cambia el nombre de polymorphic_url_without_compat después de la llamada alias_method_chain.
class ActiveRecord::PolymorphicRoutes
def polymorphic_url_with_compat(*args)
whatever...
return polymorphic_url_without_compat(*args)
end
alias_method_chain :polymorphic_url, :compat
end
Mencionó que intentó agregarlo a un complemento, por lo que es posible que lo siguiente no sea necesario si el bit anterior solucionó su problema.
La mejor manera de asegurarse de que se cargue después del núcleo de los rieles, es convertirlo en un complemento.
$ script/generate plugin polymorphic_url_backport
Creará un código auxiliar de complemento. Todas las instrucciones a partir de este momento son relevantes para el directorio de complementos creado.
En el init.rb add
if RAILS_GEM_VERSION < "2.2.1"
require File.dirname(__FILE__) + '/lib/yournamespace'
ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes)
end
Luego pegue el código anterior en su lib / yournamespace.rb
module YourNameSpace
class ActiveRecord::PolymorphicRoutes
def included(base)
base.class_eval %~
def polymorphic_url_with_compat(*args)
whatever...
return polymorphic_url_without_compat(*args)
end
alias_method_chain :polymorphic_url, :compat
~
end
end
end
Solo asegúrese de que el complemento se envíe con su aplicación y que no haya problemas. Alternativamente, puede agregar esto a la lib de su raíz de rieles, pero no estoy seguro de dónde ubicaría el código requerido para ejecutarlo en el momento adecuado.