3

我一直在升级Rails 2应用到Rails 3.2.13,并且在尝试启用缓存时遇到问题。缓存在Rails 2中工作,我使用的是相同版本的Ruby - 1.8.7。我不确定它是否相关,但我正在OSX上开发。调用expire_fragment引发“使用#url_for,你必须明确包含路由助手”错误

当expire_fragment被调用时,错误从ActionController :: Caching :: Fragments类抛出。 expire_fragment拨打电话时fragment_cache_key其中包含此:

ActiveSupport::Cache.expand_cache_key(key.is_a?(Hash) ? url_for(key).split("://").last : key, :views) 

这次调用url_for是提高这个错误

2013-07-10T14:40:50.430137+01:00 FATAL 
RuntimeError (In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers): 
lib/bio_catalogue/cache_helper.rb:175:in `expire_fragment' 
lib/bio_catalogue/cache_helper.rb:181:in `expire_service_index_tag_cloud' 
app/observers/annotation_observer.rb:33:in `expire_caches' 
app/observers/annotation_observer.rb:12:in `after_create' 
app/controllers/annotations_controller.rb:140:in `create_inline' 

这是一个延伸的远一点回溯:

freya.2235 actionpack (3.2.13) lib/abstract_controller/url_for.rb:14:in `_routes' 
freya.2235 actionpack (3.2.13) lib/action_dispatch/routing/url_for.rb:148:in `url_= 
freya.2235 for' 
freya.2235 actionpack (3.2.13) lib/action_controller/caching/fragments.rb:53:in `f= 
freya.2235 ragment_cache_key' 
freya.2235 actionpack (3.2.13) lib/action_controller/caching/fragments.rb:112:in `= 
freya.2235 expire_fragment' 
freya.2235 lib/bio_catalogue/cache_helper.rb:175:in `expire_fragment' 
freya.2235 lib/bio_catalogue/cache_helper.rb:181:in `expire_service_index_tag_clou= 
freya.2235 d' 
freya.2235 app/observers/annotation_observer.rb:33:in `expire_caches' 
freya.2235 app/observers/annotation_observer.rb:12:in `after_create' 
freya.2235 activemodel (3.2.13) lib/active_model/observing.rb:231:in `send' 
freya.2235 activemodel (3.2.13) lib/active_model/observing.rb:231:in `update' 
freya.2235 activerecord (3.2.13) lib/active_record/observer.rb:114:in `_notify_ann= 
freya.2235 otation_observer_for_after_create' 

自然我试图在调用expire_fragment的类中包含Rails.application.routes.url_helpers,但无法使用,因为错误来自ActionController模块。 ActionController :: Base已经包含了UrlFor模块,所以我的问题是: 为什么包含UrlFor的模块的一个类会引发一个错误,要求url_helpers被包含在应该能够使用url_for的情况下?

+1

我们在将它发送到expire_fragment之前通过查找url_for片段找到了解决方法。例如从 @ controller.expire_fragment(key,options) 到 @ controller.expire_fragment(Rails.application.routes.url_helpers.url_for(key.merge({:only_path => true})),options) – Njall

回答

0

我也遇到了这个错误,但在我的集成和功能测试中,甚至在使用简单link_to助手的视图中。这篇文章派我来检查我的gem依赖的路径:Routes stopped working when upgrading Rails 3.0 to 3.1

我能够通过改变以下来解决问题,FROM:

group :development, :test do 
    gem 'mocha', '0.10.0', :require => false 
    gem 'vcr', '1.11.3' 
    gem 'fakeweb', '1.3.0' 
    gem 'capistrano', '2.13.5' 
    gem 'ruby-debug-ide', '0.4.7' 
    gem 'letter_opener', '1.1.0' 
end 

TO:

group :development, :test do 
    gem 'mocha', '~> 0.14', :require => false 
    gem 'vcr', '~> 2.5' 
    gem 'fakeweb', '1.3.0' 
    gem 'capistrano', '~> 2.15' 
    gem 'ruby-debug-ide', '0.4.17', :require => false 
    gem 'letter_opener', '~> 1.1' 
end 
0

我也面临同样的问题,正如错误中提到的那样,以下url_helper模块不适用于我。

include Rails.application.routes.url_helpers 

所以我使用了自定义的网址,而不是路由帮助方法,如

messages_path(@message)改为"/messages/@message.id"

这对我的作品。

相关问题