Overring um método mixin núcleo Rails, e ainda ser capaz de chamar o método antigo
-
06-07-2019 - |
Pergunta
title Ok é confuso, eu vou te contar o meu primeiro problema:
o método polymorphic_url
foi mudado em Rails 2.2.1 para incluir algumas funcionalidades extra que eu preciso. No entanto, eu quero fazer o aplicativo ainda trabalho em versões antigas do Rails, então eu queria corrigir o comportamento 2.2.1 se uma versão Rails mais velhos está em execução.
alias_method_chain
à direita resgate? Eu não posso fazê-lo funcionar.
def polymorphic_url_with_compat(*args)
whatever...
return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat
Agora eu primeiro tentei colocar isso no helper - alias_method_chain
falha porque polymorphic_url
is not definido até então.
Então me mudei o mesmo código para o controlador, e ele não erro, mas ele é ignorado.
Então eu tentei remendar-lo em ApplicationController :: Base com um plugin -. polymorphic_url
ainda não está definida
polymorphic_url
é definido no ActionController módulo :: PolymorphicRoutes. Eu realmente não sei quando / onde é misturado no controlador / view.
Como posso quebrar este método na maneira que eu quero?
Solução
Antes de prosseguir, você tem certeza que polymorphic_url existia na versão Rails antes 2.2.1?
Você está código é mais do que certo, você está esquecendo de chamar a versão original do método. Que é polymorphic_url_without_compat rebatizado após a chamada 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
Você mencionou que tentou adicioná-lo a um plugin, então o seguinte pode não ser necessário se o bit anterior fixa o seu problema.
A melhor maneira de garantir que ele é carregado após o núcleo trilhos, é transformá-lo em um plugin.
$ script/generate plugin polymorphic_url_backport
Irá criar um esboço plugin. Todas as direções a partir deste ponto são relevantes para o diretório do plugin criado.
No add init.rb
if RAILS_GEM_VERSION < "2.2.1"
require File.dirname(__FILE__) + '/lib/yournamespace'
ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes)
end
Em seguida, cole o código acima em seu 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
Apenas certifique-se os navios de plug-in com o seu aplicativo e não deve haver problemas. Você poderia alternadamente adicione a lib do seu trilhos raiz, mas eu não sou certo exatamente onde você iria colocar o código precisa para executá-lo no momento certo.