2

will_paginate 用のカスタム リンク レンダラーを作成し、コードを lib/my_link_renderer.rb に配置しました。

require 'will_paginate/view_helpers/link_renderer'
require 'will_paginate/view_helpers/action_view'

class MyLinkRenderer < WillPaginate::ActionView::LinkRenderer
  include ListsHelper
  def to_html
    html = pagination.map do |item|
      item.is_a?(Fixnum) ?
        page_number(item) :
        send(item)
    end.join(@options[:link_separator])
    html << @options[:extra_html] if @options[:extra_html]

    @options[:container] ? html_container(html) : html
  end
end

次に、次のように使用します。

  <%= will_paginate @stuff, 
        :previous_label=>'<input class="btn" type="button" value="Previous"/>',
        :next_label=>'<input class="btn" type="button" value="Next" />',
        :extra_html=>a_helper,
        :renderer => 'WillPaginate::ActionView::MyLinkRenderer'
  %>

最初は機能しますが、2 回目は初期化されていない定数 WillPaginate::ActionView::MyLinkRenderer エラーが発生します。config/application.rb で lib からアプリケーションにファイルを正しくロードしていると思います。

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

コンソールでも同じ問題が発生します。

system :001 > WillPaginate::ActionView::MyLinkRenderer
 => MyLinkRenderer 
system :002 > WillPaginate::ActionView::MyLinkRenderer
NameError: uninitialized constant WillPaginate::ActionView::MyLinkRenderer

これは、Rails が物事を自動ロードする方法と関係があると思われます。自動ロードを使用すべきではありませんか? 「./lib/my_link_renderer」を明示的に要求する必要がありますか?

これは本番サーバーでのみ発生することに注意してください。

4

1 に答える 1

2

あなたのMyLinkRendererクラスはWillPaginate::ActionViewモジュールにないので、それを参照することWillPaginate::ActionView::MyLinkRendererは決して機能しないはずです。

MyLinkRenderer(モジュール名なしで)として参照するか、そのモジュール内にあるように定義して、次の場所に移動する必要がありlib/will_paginate/action_view/my_link_renderer.rbます。

module WillPaginate::ActionView
  class MyLinkRenderer < LinkRenderer
    …
  end
end

初めて機能するという事実は、Rails がconst_missingオートローディングを実装するために使用する方法の癖です。興味がある場合は、https ://stackoverflow.com/a/10633531/5168 の回答を参照してください。

于 2012-09-01T18:31:15.617 に答える