Call to expire_fragment raises “ to use #url_for, you must include routing helpers explicitly” error

笑着哭i 提交于 2019-12-12 15:39:21

问题


I've been upgrading a Rails 2 app to Rails 3.2.13 and am having a problems when I try to enable caching. Caching worked in Rails 2 and I'm using the same version of Ruby - 1.8.7. I'm not sure if it is relevant but I'm developing on OSX.

The error's being thrown from the ActionController::Caching::Fragments class when expire_fragment is called. expire_fragment makes a call to fragment_cache_key which contains this:

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

This call to url_for is raising this error

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'

This is the backtrace that extends a little further:

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'

Naturally I have tried to include Rails.application.routes.url_helpers in the class calling expire_fragment but to no avail as the error is coming from within the ActionController module. ActionController::Base already has the UrlFor module included in it so my question is: Why does a class of a module that includes UrlFor raise an error asking for url_helpers to be included when it should be able to use url_for just fine?


回答1:


I was also getting this error, but inside of my integration and functional tests, and even in views that were using a simple link_to helper. This post sent me down the path of checking my gem dependencies: Routes stopped working when upgrading Rails 3.0 to 3.1

I was able to resolve the issue by changing the following, 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



回答2:


I am also faced the same issue, as mentioned in error to include following url_helper module doesn't work for me.

include Rails.application.routes.url_helpers

So I have used custom urls instead of route helper methods like

messages_path(@message) changed to "/messages/@message.id"

This works for me.



来源:https://stackoverflow.com/questions/17553326/call-to-expire-fragment-raises-to-use-url-for-you-must-include-routing-helpe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!