我为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'
%>
它第一次起作用,但是第二次我得到一个未初始化的常量时将paginate::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”吗?
我应该注意这只发生在我的生产服务器上。
最佳答案
您的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