我认为这是行不通的,因为我在真实的数据库情况下对其进行了测试,并且始终返回数据库的内容
Rails.cache.fetch
再次执行Rails.cache.fetch
,在这里not应该返回我在db中修改的新值。但它发生了,没有执行缓存
类翻译 结束def self.translate(es_text,locale=I18n.locale)
Rails.cache.fetch("#{es_text}/#{locale}", expires_in: 1.month) do
trad=self.find_by_es_text(es_text)
translated=eval("trad.#{locale}_text")
return translated if translated.present?
end
end
测试:
我执行Translation.translate('Alojamiento','en')
并返回在DB上找到的内容:"Accomodation"
然后我修改数据库表,将“ Accomodation”替换为“ Accomodation ---”,并提交,...
回到Rails,执行相同的Translation.translate('Alojamiento','en')
并返回新值"Accomodation---"
!!!
但是不应该!!是不是?因为我没有将expires_in: 1.month
放在1.second
或者,Rails是否知道何时修改数据库并自动使缓存过期?
我认为缓存无法正常工作,或者可能缺少某些配置
非常感谢
一种使“它起作用”的方法(但我不喜欢)是在方法控制器中移动Rails.cache...
代码,并调用类似www.app/translate/Alojamiento?locale=en
的网址。在这种情况下,它可以工作,但是在模型中进行缓存更为正确。
class ApplicationController < ActionController::Base
...
def translate
text_return=Rails.cache.fetch("#{params[:es_text]}/#{params[:locale]}", expires_in: 1.month) do
Translation.translate(params[:es_text],params[:locale])
end
render text: text_to_return
end
解决方案是将缓存结果放入变量中,然后将其返回