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?

Foi útil?

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.

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