2012-09-01 43 views
2

變量I已經爲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。我相信我正在從我的應用程序中加載文件到我的應用程序正確在我的配置/ application.rb:

# 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 

懷疑這與軌道自動加載的事情有關。我應該不使用自動加載?我應該明確要求'./lib/my_link_renderer'嗎?

我應該注意到這隻發生在我的生產服務器上。

回答

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

+0

哦,我明白了!非常感謝! – freedrull

+0

感謝您的解釋鏈接,我想知道... ... – freedrull

相關問題