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'
  %>

它第一次工作,但第二次我得到一个未初始化的常量 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

它第一次工作的事实是 Railsconst_missing用来实现自动加载的方式的一个怪癖。如果您好奇,请参阅此答案:https ://stackoverflow.com/a/10633531/5168

于 2012-09-01T18:31:15.617 回答