Вызов expire_fragment вызывает использование #url_for, вы должны явно указать ошибку маршрутизации.

Я обновлял приложение Rails 2 до Rails 3.2.13, и у меня возникли проблемы при попытке включить кэширование. Кэширование работало в Rails 2, и я использую ту же версию Ruby — 1.8.7. Я не уверен, что это актуально, но я разрабатываю OSX.

Ошибка возникает из класса ActionController::Caching::Fragments при вызове expire_fragment. 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'

Естественно, я попытался включить Rails.application.routes.url_helpers в класс, вызывающий expire_fragment, но безрезультатно, поскольку ошибка исходит из модуля ActionController. В ActionController::Base уже включен модуль UrlFor, поэтому мой вопрос: почему класс модуля, который включает UrlFor, вызывает ошибку с просьбой включить url_helpers, когда он должен иметь возможность использовать url_for просто отлично?


person Njall    schedule 09.07.2013    source источник
comment
Мы нашли обходной путь, найдя url_for фрагмента перед его отправкой в ​​expire_fragment. например, от @controller.expire_fragment(key, options) до @controller.expire_fragment(Rails.application.routes.url_helpers.url_for(key.merge({:only_path =› true})), options)   -  person Njall    schedule 12.07.2013


Ответы (2)


Я также получал эту ошибку, но внутри моих интеграционных и функциональных тестов и даже в представлениях, которые использовали простой помощник link_to. Этот пост отправил меня на путь проверки моих зависимостей от драгоценных камней: 1">Маршруты перестали работать при обновлении 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

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
person steakchaser    schedule 18.07.2013

Я также столкнулся с той же проблемой, как указано в ошибке, чтобы включить следующий модуль url_helper, у меня не работает.

include Rails.application.routes.url_helpers

Поэтому я использовал пользовательские URL-адреса вместо вспомогательных методов маршрута, таких как

messages_path(@message) изменено на "/messages/@message.id"

Это работает для меня.

person rahul patil    schedule 16.06.2015