3

Rails 2 アプリを Rails 3.2.13 にアップグレードしましたが、キャッシュを有効にしようとすると問題が発生します。キャッシングは Rails 2 で機能し、私は同じバージョンの Ruby - 1.8.7 を使用しています。関連性があるかどうかはわかりませんが、OSX で開発しています。

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_for を正常に使用できるはずなのに、url_helpers を含めるように要求するエラーが発生するのはなぜですか?

4

2 に答える 2

0

次の url_helper モジュールを含めるとエラーで述べたように、私も同じ問題に直面しています。

include Rails.application.routes.url_helpers

そのため、次のようなルート ヘルパー メソッドの代わりにカスタム URL を使用しました。

messages_path(@message)に変更"/messages/@message.id"

これは私にとってはうまくいきます。

于 2015-06-16T04:44:10.257 に答える
0

このエラーも発生していましたが、統合テストと機能テストの内部で、さらには単純な link_to ヘルパーを使用していたビューでも発生しました。この投稿は、gem の依存関係を確認する方法を教えてくれました: Rails 3.0 から 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

に:

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
于 2013-07-18T05:11:59.760 に答える