web-dev-qa-db-ja.com

Railsでgemからモジュールメソッドをオーバーライドする

Oracleのバージョンでは、will_paginate gemが壊れています。デフォルト paginate_by_sql WillPaginateモジュールのメソッドは、追加の 'AS'をクエリに挿入して失敗させています。

コード自体は簡単に修正できますが、Railsを取得して変更を取得する最善の方法はわかりません。

Gem自体のコードを変更したくないのは、コードが他のマシンで壊れてしまうからです。

次を含むlib/test.rbファイルを作成してみました。

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

それをenvironment.rbから要求しますが、それは私の変更を反映していません。また、controllers/application.rbから要求することを試みましたが、再度、変更を反映しませんでした。

一時的に、特定のモデル自体の中でメソッドをオーバーライドすることで機能するようになりましたが、これはちょっとしたハックであり、このプロジェクトの他のモデルでは使用できません。

これを行う簡単な方法があると確信していますが、Googleを使用して追跡する運はありません。

47
Dave Smylie

あなたがしていることは機能しますが、コードは次のように見える必要があります:

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

つまり、Finder.rbに移動し、モジュールヘッダーとオーバーライドするメソッドを除くすべてを削除してから、libのファイルに保存し、environment.rbに含めます。出来上がり、インスタントモンキーパッチ!

29
Sarah Mei

より簡潔なソリューション:

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

コードをconfig/initializersの初期化ファイルに入れます。これは、環境のロード時に実行する必要があるコードを置く正しい場所です。また、コードをより適切に整理し、各ファイルの意図を明確にします。したがって、バグを追跡しやすくなります。 environment.rbを乱雑にしないでください!

67
Steve Graham

OK、私は私のような、他の答えを読んだ後でもまだ苦労している人のためにこれを簡単にするつもりです

最初のコード行を検索することにより、githubリポジトリで変更したいコードを見つけます( pry )gemを変更し、左側のCodeの代わりにIssuesを選択します

enter image description here

enter image description here

Next変更するモジュールのコンテンツをコピーし、config/initializersフォルダー内の適切な名前の.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

次に、コードに追加の変更を加えて、サーバーを再起動します。

離れて!

49
Abram