2009-02-24 3 views
43

내 오라클 버전에서 will_paginate 보석이 깨졌습니다. WillPaginate 모듈의 기본 paginate_by_sql 메서드는 추가 'AS'를 쿼리에 삽입하여 실패하게 만듭니다.레일에서 보석의 모듈 메소드 오버라이드

코드 자체는 쉽게 수정할 수 있지만 Rails가 내 변경 사항을 선택하는 가장 좋은 방법은 아닙니다.

보석 자체의 코드를 변경하고 싶지 않습니다. 다른 컴퓨터에서 코드가 손상 될 수 있기 때문입니다.

나는이 포함 된 lib 디렉토리/test.rb 파일 생성 시도 :

module WillPaginate 
    def paginate_by_sql 
    (my code goes here) 
    end 
end 

을하고 environment.rb에에서 그것을 필요로하지만, 내 변화를 정확히 인식하지 못한 것입니다. 컨트롤러/application.rb에서도 필요하지만 다시 변경하지 않았습니다.

일시적으로 특정 모델 자체에서 메서드를 재정 의하여 작동 시키지만 약간 해킹 된 것으로이 프로젝트의 다른 모델에서는 사용할 수 없습니다.

쉬운 방법이있을 것이라고 확신하지만 Google을 사용하여 추적하는 행운을 얻지는 못합니다.

+0

보석 코드가 고장났다면, 도처에 깨졌을 것입니다. 프로젝트에 버그를 기록 했습니까? http://wiki.github.com/mislav/will_paginate/report-bugs –

+0

아직 - 버그가 oracle 특정 경우를 처리하는 블록에 있습니다. oracleenhanced (oracle 또는 oci 대신) 어댑터를 사용하고 있기 때문에 그 원인이 있습니다. 나는 대부분의 ppl이 오라클 어댑터를 사용하고 있으며 이것으로 실행되지 않을 것이라고 생각합니다.) 어쨌든 버그를 곧 로깅 할 것입니다. –

답변

27

것은 당신이 의지의 일을하고 있지만 코드는 다음과 같이 할 필요가 무엇 : 즉

module WillPaginate 
    module Finder 
    module ClassMethods 
     def paginate_by_sql(sql, options) 
     # your code here 
     end 
    end 
    end 
end 

, finder.rb에 들어가는 모듈 헤더와 재정의 할 방법을 제외하고 모두 삭제 그런 다음 lib의 파일에 저장하고 environment.rb에 포함하십시오. 보일 라, 즉시 원숭이 패치!

+0

차가움. 감사. 그 트릭을 했어 =) –

+13

이것은 초기화 프로그램'config/initializers'에 있어야합니다 - 이것을'environment.rb' 파일에 넣지 마십시오! – Tilo

61

더 간결 솔루션 :

WillPaginate::Finder::ClassMethods.module_eval do 
def paginate_by_sql sql, options 
    # Your code here 
end 
end 

가/설정에서 초기화 파일에 이니셜을 코드를 넣습니다. 이것은 환경이로드 될 때 실행해야하는 코드를 넣을 수있는 올바른 위치입니다. 또한 코드를 더 잘 구성하여 각 파일의 의도를 명확하게하여 버그를 쉽게 추적 할 수 있습니다. 환경을 혼란스럽게하지 마라.

+0

기본 클래스가'autoload'를 통해로드되는 경우 흥미로운 코너 케이스 : http://stackoverflow.com/questions/8736451/override-a-method-inside-a-gem-from-another-gem – Tilo

+1

아주 멋지다. 새로운'paginate_by_sql'에서 이전 버전에 액세스 할 수 있습니까? 'super (sql, options)'와 같은 것을 부를 수 있을까요? –

38

좋아, 나는 이제 와서 다른 답을 읽은 후에도 조금 어려움을 겪는 나 자신을 좋아하는 사람들에게 이것을 더 쉽게 만들 것이다.

먼저 당신이 (당신이 쉽게이 pry를 사용하여 찾을 수) 당신이 보석으로 변경하려면, 다음에 Code을 선택하는 코드 줄을 검색하여 github의의의 repo에 변경하고자하는 코드를 찾을 수 대신 Issues

enter image description here

enter image description here

다음 복사 콩트의 왼쪽 nt를 변경하고 config/initializers 폴더 안에있는 .rb 파일에 적절하게 넣으십시오.다음은 그 예이다 : 지금

Forem::TopicsHelper.module_eval do 
    def link_to_latest_post(post) 
    text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}" 
    link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}") 
    end 
end 

코드에 추가 변경하고 서버를 다시 시작합니다

module Forem 
    module TopicsHelper 
    def link_to_latest_post(post) 
     text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}" 
     link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}") 
    end 
    end 
end 

이제로 변경.

어쨌든 간다!

+0

원래 메소드를 호출 할 수 있습니까, 아니면 레일스에 alias_method_chain이 있습니까? – Machisuji

+0

원본 방법 – Abram

+1

@Abram에 감사드립니다! 이것은 매우 도움이되었다! – KavitaC

관련 문제