【问题标题】:Caching variables in rails application controller在 Rails 应用程序控制器中缓存变量
【发布时间】:2014-06-01 14:53:51
【问题描述】:

我在应用程序控制器中有以下代码:

class ApplicationController < ActionController::Base
  before_filter :find_today_forecast
  ...
  def find_today_forecast
    @today_forecast = Weather.displayed.city(@city).first
  end
end

变量@today_forecast 仅在我在生产和开发环境中重新启动应用程序时更新。

Rails.cache.clear 和 rake tmp:clear 不起作用。有什么问题

更新,天气模型和 YandexWeather 解析器:

class Weather < ActiveRecord::Base
  DISPLAY_COUNT = 7
  belongs_to :city
  scope :city, lambda {|field| {:conditions => {:city_id => field}}}

  validates_presence_of :temp_high, :temp_low
  validates_uniqueness_of :date, :scope => :city_id

  scope :displayed, :conditions => ['date >= ?', Date.today], :order => 'date ASC', :limit => Weather::DISPLAY_COUNT

  def high
    self.temp_high.to_i > 0 ? '+' + self.temp_high.to_s : self.temp_high
  end

  def low
    self.temp_low.to_i > 0 ? '+' + self.temp_low.to_s : self.temp_low
  end

  # загружаем погоду из Яндекса
  def self.load(city)
    begin
      YandexWeather.new(city).create_weathers
    rescue
      Rails.logger.info "no weather for city - #{city.title}"
    end
  end

end

class YandexWeather
  ICON_NAMES = {
    'ovc_ra' => 'heavy-rain',
    'ovc_-ra' => 'heavy-rain',
    'bkn_na' => 'heavy-cloud-day',
    'skc_n' => 'sun',
    'skc_d' => 'night',
    'ovc' => 'heavy-cloud-day',
    'bkn_-ra_n' => 'heavy-rain',
    'bkn_d' => 'medium-cloud',
    'bkn_n' => 'medium-cloud-night',
    'bkn_-ra_d' => 'rain',
    'ovc_-sn' => 'snow',
    'ovc_ts_ra' => 'heavy-storm',
    'bkn_-sn_n' => 'snow',
    'ovc_sn' => 'snow',
    'bkn_-sn_d' => 'chance_of_snow',
    'bkn_ra_d' => 'rain',
    'bkn_ra_n' => 'rain'
  }

  PER_PAGE = 10

  def initialize city
    @agent = Mechanize.new
    @city = city
  end

  ...
end

【问题讨论】:

  • 能把displayed和city的代码也加进去吗?
  • 需要查看您的Weather 模型。
  • 添加了天气模型。天气与 yandex 天气解析器对话。从 cron 开始的解析器。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

问题出在您的displayed 范围内

scope :displayed, :conditions => ['date >= ?', Date.today], :order => 'date ASC', :limit => Weather::DISPLAY_COUNT

Date.today 只在第一次被评估。

您需要将其更改为 lambda 范围,以便在每次调用时对其进行评估。

scope :displayed, -> {
  where("date >= ?", Date.today).
  order("date ASC").limit(Weather::DISPLAY_COUNT)
}

一般来说,只要您的作用域中有变化的部分,您就应该将其实现为 lambda (-&gt;) 作用域。

【讨论】:

  • 抱歉问这个问题。我可以知道哪个 Rails 版本中的lambda 被替换为-&gt; 符号吗?可以给我一个来源吗?
  • 没有问题 :-)。它是 rails 4 风格,但 lambda 仍然可以使用。看看这个stackoverflow.com/questions/16588077/…。你可以选择你喜欢的别名
  • 谢谢。很高兴知道。 :)
  • 你指的是我吗?我不是 OP :)
  • -&gt; 是lambda 的另一种语法,在 Ruby 1.9 中引入。这不是 lambda 的替代品,也与 Rails 无关。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多