2016-11-05 6 views
5

Я запускаю Rails 4.2.7 на Ubuntu 14.04. Я написал следующий метод, чтобы помочь кэшировать некоторые данные (предотвращение хитов против моих Postgres 9,5 базы данных) ...Как очистить кеш-файл Rails?

class Country < ActiveRecord::Base 
    has_many :states 

    def self.cached_find_by_iso(iso) 
    Rails.cache.fetch("#{iso}") do 
     find_by_iso(iso) 
    end 
    end 

end 

Однако, даже после запуска грабли ТМП: кэш: очистить и перезапустить свой сервер, я получаю эту ошибку при попытке вызова выше ...

Error during processing: Not a directory @ rb_file_s_rename - (/home/rails/myproject/tmp/cache/00020161104-1093-67j634, /home/rails/myproject/tmp/cache/001/000/) 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:528:in `rename' 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:528:in `block in mv' 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest' 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1587:in `fu_each_src_dest0' 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest' 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:517:in `mv' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/core_ext/file/atomic.rb:36:in `atomic_write' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache/file_store.rb:83:in `write_entry' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache/strategy/local_cache.rb:115:in `write_entry' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:391:in `block in write' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:547:in `block in instrument' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:166:in `instrument' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:547:in `instrument' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:389:in `write' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:588:in `save_block_result_to_cache' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:299:in `fetch' 
/home/rails/myproject/app/models/country.rb:5:in `cached_find_by_iso' 
/home/rails/myproject/app/services/all_events_guide_service.rb:84:in `block in process_page_data' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each' 
/home/rails/myproject/app/services/all_events_guide_service.rb:45:in `process_page_data' 
/home/rails/myproject/app/services/abstract_import_service.rb:83:in `process_my_object_data' 
/home/rails/myproject/app/services/all_events_guide_my_object_finder_service.rb:103:in `block in process_my_object_link' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto' 
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each' 
/home/rails/myproject/app/services/all_events_guide_my_object_finder_service.rb:82:in `process_my_object_link' 
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:29:in `block in process_data' 
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:28:in `each' 
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:28:in `process_data' 
/home/rails/myproject/app/services/run_crawlers_service.rb:18:in `block in run_all_crawlers' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' 
/home/rails/myproject/app/services/run_crawlers_service.rb:5:in `run_all_crawlers' 
/home/rails/myproject/app/controllers/my_objects_controller.rb:170:in `block in import' 

Что такое правильный способ очистить кэш и разрешить мой метод кэшируются, чтобы начать работу должным образом?

Edit: я получаю ту же ошибку выше с предложением Дипак, но вот выход к его ответу ...

[email protected]:~/myproject$ rails console 
Loading development environment (Rails 4.2.7.1) 
2.3.0 :001 > Rails.cache.clear 
=> ["/home/rails/myproject/tmp/cache/assets"] 
2.3.0 :002 > quit 

Edit 2: Вот мой конфиг/environments.production.rb файл. Это производственная среда ...

Rails.application.configure do 
    # Settings specified here will take precedence over those in config/application.rb. 

    # Code is not reloaded between requests. 
    config.cache_classes = true 

    # Eager load code on boot. This eager loads most of Rails and 
    # your application in memory, allowing both threaded web servers 
    # and those relying on copy on write to perform better. 
    # Rake tasks automatically ignore this option for performance. 
    config.eager_load = true 

    # Full error reports are disabled and caching is turned on. 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 

    # Enable Rack::Cache to put a simple HTTP cache in front of your application 
    # Add `rack-cache` to your Gemfile before enabling this. 
    # For large-scale production use, consider using a caching reverse proxy like 
    # NGINX, varnish or squid. 
    # config.action_dispatch.rack_cache = true 

    # Disable serving static files from the `/public` folder by default since 
    # Apache or NGINX already handles this. 
    config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 

    # Compress JavaScripts and CSS. 
    config.assets.js_compressor = :uglifier 
    # config.assets.css_compressor = :sass 

    # Do not fallback to assets pipeline if a precompiled asset is missed. 
    config.assets.compile = false 

    # Asset digests allow you to set far-future HTTP expiration dates on all assets, 
    # yet still be able to expire them through the digest params. 
    config.assets.digest = true 

    # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb 

    # Specifies the header that your server uses for sending files. 
    # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 
    # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 

    # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
    # config.force_ssl = true 

    # Use the lowest log level to ensure availability of diagnostic information 
    # when problems arise. 
    config.log_level = :debug 

    # Prepend all log lines with the following tags. 
    # config.log_tags = [ :subdomain, :uuid ] 

    # Use a different logger for distributed setups. 
    # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 

    # Use a different cache store in production. 
    # config.cache_store = :mem_cache_store 

    # Enable serving of images, stylesheets, and JavaScripts from an asset server. 
    # config.action_controller.asset_host = 'http://assets.example.com' 

    # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 
    # the I18n.default_locale when a translation cannot be found). 
    config.i18n.fallbacks = true 

    # Send deprecation notices to registered listeners. 
    config.active_support.deprecation = :notify 

    # Use default logging formatter so that PID and timestamp are not suppressed. 
    config.log_formatter = ::Logger::Formatter.new 

    # Do not dump schema after migrations. 
    config.active_record.dump_schema_after_migration = false 

    config.serve_static_assets = true 
    config.assets.compile = true 
end 
+0

все зависит от того, где вы храните свой кеш. проверьте конфигурационные файлы и найдите: config.cache_store, а затем выполните очистку в соответствии с вашими настройками. – num8er

+0

У меня нет такой настройки нигде в моем приложении. В моем файле config/environment/proudtion.rb строка закомментирована: «# config.cache_store =: mem_cache_store» – Dave

+0

Deepak ответил на ваш вопрос – num8er

ответ

12

Вместо rake tmp:cache:clear выполните следующую команду в консоли

Rails.cache.clear 

Это очистит кэш от любого кэша магазина вы используете

config.cache_store = :file_store 
# or 
config.cache_store = :mem_cache_store 
+0

В моем комментарии к numBar у меня нет настроек файла config.cache_store. Тем не менее, я отредактировал свой вопрос, чтобы показать ваше предложение. Я все еще получаю «Не каталог @ rb_file_s_rename» после запуска команд, подробно описанных в редактировании. – Dave

+0

Вы также можете опубликовать настройки из своего development.rb или production.rb –

+0

Конечно, отредактировал мой вопрос, чтобы включить файл config/enviornmetns/produciton.rb (это производственная среда) – Dave

1

Это выглядит как ваше приложение каким-то образом требует, чтобы путь tmp/cache/001/000/ существовал. И, как вы можете видеть в: https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/tasks/tmp.rake#L25-L30, задание rake tmp:cache:clear удалено все содержимое от tmp/cache включая 001/000. Я думаю, что быстрым решением было бы вручную создать этот путь на mkdir -p tmp/cache/001/000/ внутри вашего корня проекта после очистки кеша.

Вы можете добавить задачу для вашего приложения, чтобы автоматизировать это, rails g task cache и писать что-то вроде:

namespace :cache do 
    task :clear do 
    FileUtils.rm_rf(Dir['tmp/cache/[^.]*']) 
    `mkdir -p tmp/cache/001/000/` 
    end 
end 

Вы можете затем вызвать ваш обычай rake cache:clear и быть уверенными, что требуемый путь существует.