Rails Core Mixin 방법을 넘어서도 여전히 기존 방법을 호출 할 수 있습니다.

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

  •  06-07-2019
  •  | 
  •  

문제

OK 제목은 혼란 스럽습니다. 먼저 내 문제를 말해주십시오.

그만큼 polymorphic_url 레일 2.2.1에서 방법이 변경되었습니다. 필요한 추가 기능을 포함 시켰습니다. 그러나 응용 프로그램이 여전히 오래된 버전의 레일에서 작동하도록하고 싶으므로 이전 레일 버전이 실행중인 경우 2.2.1 동작에 패치하고 싶었습니다.

alias_method_chain 구조에 맞습니까? 나는 그것을 작동시킬 수 없다.

def polymorphic_url_with_compat(*args)
  whatever...
  return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat

이제 나는 이것을 도우미에 넣었습니다. alias_method_chain 실패하기 때문에 polymorphic_url 그때까지 정의되지 않습니다. 그래서 동일한 코드를 컨트롤러로 옮겼으므로 오류는 아니지만 무시됩니다. 그런 다음 플러그인을 사용하여 ApplicationController :: Base에 패치를 시도했습니다. polymorphic_url 아직 정의되지 않았습니다.

polymorphic_url 모듈 ActionController :: polymorphicroutes에 정의됩니다. 컨트롤러/보기에 언제/어디서 혼합되어 있는지 알 수 없습니다.

이 방법을 원하는 방식으로 어떻게 줄일 수 있습니까?

도움이 되었습니까?

해결책

진행하기 전에 2.2.1 이전에 Polymorphic_url이 Rails 버전에 존재했다고 확신합니까?

당신은 코드가 대부분 옳습니다. 원래 버전의 메소드를 호출하는 것을 잊고 있습니다. alias_method_chain 호출 후 polymorphic_url_without_compat로 이름이 변경됩니다.

class ActiveRecord::PolymorphicRoutes
  def polymorphic_url_with_compat(*args)
    whatever...
    return polymorphic_url_without_compat(*args)
  end
  alias_method_chain :polymorphic_url, :compat
end

플러그인에 추가하려고 했으므로 이전 비트가 문제를 해결하면 다음이 필요하지 않을 수 있습니다.

Rails 코어 이후로드되도록하는 가장 좋은 방법은 플러그인으로 전환하는 것입니다.

$ script/generate plugin polymorphic_url_backport

플러그인 스텁을 만듭니다. 이 시점의 모든 방향은 생성 된 플러그인 디렉토리와 관련이 있습니다.

init.rb에서 추가

if RAILS_GEM_VERSION < "2.2.1"
  require File.dirname(__FILE__) + '/lib/yournamespace'
  ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes) 
end

그런 다음 위의 코드를 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  

플러그인이 애플리케이션과 함께 제공되면 아무런 문제가 없어야합니다. 당신은 이것을 당신의 레일 뿌리의 lib에 번갈아 추가 할 수 있지만, 적절한 시간에 그것을 실행하기 위해 필요한 코드를 어디에 배치 할 것인지 정확히 알 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top