레일의 보석에서 모듈 방법을 우선합니다
-
06-09-2019 - |
문제
will_paginate 보석은 내 버전의 Oracle에서 깨졌습니다. 기본값 paginate_by_sql
WillPaginate 모듈의 메소드는 쿼리에 '추가'를 삽입하여 실패합니다.
코드 자체는 쉽게 고정되어 있지만 레일이 내 변경을 선택하는 가장 좋은 방법은 확실하지 않습니다.
보석 자체의 코드를 변경하고 싶지 않습니다. 다른 시스템에서 내 코드를 고장날 것입니다.
lib/test.rb 파일을 포함하는 시도를 시도했습니다.
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
그리고 환경에서 필요로하지만 RB이지만 변경 사항을 선택하지는 않습니다. 또한 컨트롤러/application.rb에서 요구하려고 시도했지만 다시는 변경 사항을 선택하지 않았습니다.
일시적으로, 나는 특정 모델 자체 내에서 메소드를 무시함으로써 작동하게했지만, 이것은 약간의 해킹이며,이 프로젝트의 다른 모델에서는 사용할 수 없다는 것을 의미합니다.
이 작업을 수행하는 쉬운 방법이 있다고 확신하지만 Google을 사용하여 추적하는 운이 없습니다.
해결책
당신이하고있는 일은 효과가 있지만 코드는 다음과 같아야합니다.
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
다시 말해, Finder.rb로 이동하여 모듈 헤더와 재정의하려는 메소드를 제외한 모든 것을 삭제 한 다음 Lib의 파일에 저장하고 환경에 포함시킵니다. Voila, 인스턴트 원숭이 패치!
다른 팁
보다 간결한 솔루션 :
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Config/Initializers에서 코드를 이니셜 라이저 파일에 넣으십시오. 이곳은 환경이로드 될 때 실행 해야하는 코드를 넣을 수있는 올바른 장소입니다. 또한 코드를 구성하여 각 파일의 의도를 명확하게 만들므로 버그를 쉽게 추적 할 수 있습니다. 환경을 혼란시키지 마십시오 .RB!
좋아, 나는 다른 답변을 읽은 후에도 나 자신과 같은 사람들이 더 쉽게 어려움을 겪게 할 것입니다.
첫 번째 코드 라인을 검색하여 Github Repo에서 변경하려는 코드를 찾으십시오 (사용 사용을 쉽게 찾을 수 있습니다. 캐내다) 보석을 바꾸고 선택하고 싶습니다. Code
대신 왼쪽에 Issues
다음 변경하려는 모듈의 내용을 복사하여 적절하게 명명 된 상태로 배치하십시오. .rb
구성/초기화 폴더 내부의 파일. 예는 다음과 같습니다.
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
이제 다음으로 변경하십시오.
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
이제 코드를 추가로 변경하고 서버를 다시 시작하십시오.
멀리 간다!