Установка cache_store в инициализаторе - PullRequest
19 голосов
/ 28 апреля 2011

Я пытаюсь использовать redis-store в качестве моего Rails 3 cache_store. У меня также есть initializer / app_config.rb, который загружает файл yaml для настроек конфигурации. В моем инициализаторе / redis.rb у меня есть:

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 

Однако это не похоже на работу. Если я сделаю:

Rails.cache

в моей консоли rails я ясно вижу, что она использует

ActiveSupport.Cache.FileStore

в качестве хранилища кеша вместо redis-store. Тем не менее, если я добавлю конфиг в мой файл application.rb следующим образом:

config.cache_store = :redis_store 

все работает нормально, за исключением того, что инициализатор конфигурации приложения загружается после application.rb, поэтому у меня нет доступа к APP_CONFIG.

Кто-нибудь испытывал это? Я не могу установить хранилище кэша в инициализаторе.

Ответы [ 6 ]

21 голосов
/ 28 апреля 2011

После некоторых исследований вероятное объяснение состоит в том, что инициализатор initialize_cache запускается раньше, чем рельсы / инициализаторы.Так что, если он не определен ранее в цепочке выполнения, хранилище кэша не будет установлено.Вы должны настроить его ранее в цепочке, как в application.rb или средах / production.rb

Моё решение было перенести загрузку APP_CONFIG до того, как приложение будет настроено так:

APP_CONFIG = YAML.load_file(File.expand_path('../config.yml', __FILE__))[Rails.env]

и затем в том же файле:

config.cache_store = :redis_store, APP_CONFIG['redis']

Другой вариант состоял в том, чтобы поместить cache_store в блок before_configuration, что-то вроде этого:

config.before_configuration do
  APP_CONFIG = YAML.load_file(File.expand_path('../config.yml', __FILE__))[Rails.env]
  config.cache_store = :redis_store, APP_CONFIG['redis']
end
3 голосов
/ 27 июля 2016

config/initializers запускаются после инициализации Rails.cache, но после config/application.rb и config/environments.

Конфигурация в config / application.rb или окружении

Таким образом, одним из решений было бы настроить кэш в config/application.rb или config/environments/*.rb.

Конфигурация в config / initializers / cache.rb

Если кеш должен быть настроен в инициализаторе преднамеренно, это можно сделать, установив Rails.cache вручную после настройки:

# config/initializers/cache.rb
Rails.application.config.cache_store = :redis_store, APP_CONFIG['redis']

# Make sure to add this line (http://stackoverflow.com/a/38619281/2066546):
Rails.cache = ActiveSupport::Cache.lookup_store(Rails.application.config.cache_store)

Добавить спецификацию

Чтобы убедиться, что это работает, добавьте следующую спецификацию:

# spec/features/smoke_spec.rb
require 'spec_helper'

feature "Smoke test" do
  scenario "Testing the rails cache" do
    Rails.cache.write "foo", "bar"
    expect(Rails.cache.read("foo")).to eq "bar"
    expect(Rails.cache).to be_kind_of ActiveSupport::Cache::RedisStore
  end
end

Дополнительная информация

3 голосов
/ 15 мая 2013

Я попробовал следующее, и это сработало.

MyApp::Application.config.cache_store = :redis_store
self.class.send :remove_const, :RAILS_CACHE if self.class.const_defined? :RAILS_CACHE
RAILS_CACHE = ActiveSupport::Cache.lookup_store(MyApp::Application.config.cache_store)
2 голосов
/ 03 мая 2011

В исходной настройке, поможет ли вам изменить:

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 

на:

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 
RAILS_CACHE = MyApp::Application.config.cache_store

?

0 голосов
/ 08 января 2016

В инициализаторе

REDIS ||= Rails.configuration.redis_client

В приложении.rb

config.redis_client = Redis.new({
  :host => ENV["REDIS_HOST"], 
  :port => ENV["REDIS_PORT"],
  :db => ENV["REDIS_DB"].to_i,
})

config.cache_store = :redis_store, { client: config.redis_client }
0 голосов
/ 11 октября 2011

Была такая же проблема, и установка RAILS_CACHE в MyApp::Application.config.cache_store также исправила ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...