Superar un método de mezcla de núcleos de Rails y seguir siendo capaz de llamar al método antiguo

StackOverflow https://stackoverflow.com/questions/1620468

  •  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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top