55

私のバージョンの Oracle では、will_paginate gem が壊れています。paginate_by_sqlWillPaginate モジュールのデフォルトの方法では、余分な「AS」がクエリに挿入され、クエリが失敗します。

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

gem 自体のコードを変更したくありません。変更すると、他のマシンでコードが壊れてしまうからです。

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

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

environment.rbからそれを要求していますが、私の変更を反映していません。また、controllers/application.rb から要求しようとしましたが、やはり変更が反映されませんでした。

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

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

4

3 に答える 3

78

より簡潔な解決策:

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

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

于 2009-12-05T15:14:36.830 に答える
60

わかりました、他の回答を読んだ後も少し苦労している私のような人々のために、これを簡単にするつもりです.

最初に、gem で変更したいコード行を検索して ( pryを使用して簡単に見つけることができます)、変更したいコードを github リポジトリで見つけてからCode、代わりに左側を選択します。Issues

ここに画像の説明を入力

ここに画像の説明を入力

次に、変更したいモジュールのコンテンツをコピーし、.rbconfig/initializers フォルダー内の適切な名前のファイルに配置します。次に例を示します。

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

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

離れろ!

于 2014-01-30T01:10:41.250 に答える
32

あなたがしていることはうまくいきますが、コードは次のようにする必要があります。

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

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

于 2009-02-24T04:44:56.407 に答える