복붙노트

[RUBY-ON-RAILS] 레일의 보석에서 모듈 방식을 재정의

RUBY-ON-RAILS

레일의 보석에서 모듈 방식을 재정의

will_paginate 보석은 오라클의 내 버전 나뉩니다. WillPaginate 모듈의 기본 paginate_by_sql 방법은 질의에 추가 'AS'를 삽입하고 실패를 야기한다.

코드 자체는 쉽게 고정,하지만 난 내 변화를 데리러 레일을 얻을 수있는 가장 좋은 방법의 확실하지 않다.

나는 내 코드가 다른 컴퓨터에 깨진 떠날 것 같은, 보석 자체의 코드를 변경하지 않습니다.

나는이 포함 된 lib 디렉토리 / test.rb 파일을 생성하려고 :

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

그리고으로 environment.rb에서 그것을 필요로하지만, 내 변화를 정확히 인식하지 못한 것입니다. 또한 컨트롤러 / application.rb에서 그것을 필요로했지만, 다시 내 변경 사항을 따기 없습니다.

일시적으로, 나는 특정 모델 자체 내에서 메서드를 재정 의하여 작업에있어, 그러나 이것은 해킹의 비트, 그리고 수단 나는이 프로젝트에 다른 모델 중 하나에서 사용할 수 없습니다.

나는 확실히 거기에이 작업을 수행 할 수있는 쉬운 방법이지만, 내가 구글을 사용하여 아래를 추적 운을 가지고 있지 않다입니다.

해결법

  1. ==============================

    1.이런 식으로 당신이 의지 작업을하고 있지만, 코드의 요구 사항을 볼 수 있습니다 :

    이런 식으로 당신이 의지 작업을하고 있지만, 코드의 요구 사항을 볼 수 있습니다 :

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

    즉, finder.rb로 이동, 모듈 헤더와 재 지정할 방법을 제외하고 삭제 모든 후 lib 디렉토리의 파일에 저장하고 environment.rb에에 포함. 짜잔, 인스턴트 원숭이 패치!

  2. ==============================

    2.더 간결 솔루션 :

    더 간결 솔루션 :

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

    설정 / 초기화의 초기화 파일에 코드를 넣습니다. 이 환경이로드 될 때 요구가 실행되도록하는 것이 코드를 삽입 할 수있는 올바른 장소입니다. 그것은 또한 더 나은 만드는 코드를 구성 각 파일의 의도를 명확하게, 따라서 버그를 추적하기 쉬울 것이다. environment.rb에 아무런 영향도 미치지하지 마십시오!

  3. ==============================

    3.좋아, 난 그냥 따라 와서 아직 다른 답변을 읽은 후 조금 투쟁 자신과 같은 사람들이 쉽게 만들거야.

    좋아, 난 그냥 따라 와서 아직 다른 답변을 읽은 후 조금 투쟁 자신과 같은 사람들이 쉽게 만들거야.

    먼저 (당신이 쉽게 사용 놀리려는를 찾을 수) 당신이 보석으로 변경하려면, 다음 문제 대신 왼쪽 코드를 선택하는 코드 줄을 검색하여 당신은 GitHub의의의 repo에 변경하고자하는 코드를 찾을 수

    다음으로 복사합니다 변경하고 설정 / 초기화 폴더의 적절하게 이름을 .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
    

    이제, 코드를 추가 변경하고 서버를 다시 시작합니다.

    멀리 당신은 간다!

  4. from https://stackoverflow.com/questions/580314/overriding-a-module-method-from-a-gem-in-rails by cc-by-sa and MIT license