2

Rails 版本:3.1 Ruby 版本:1.9.2

在我当前的一个项目中,对于每个请求,我都会在日志中收到数十条“警告:已初始化常量”行。有问题的常量位于 lib 中定义的模块中。

我完全困惑为什么 Rails 每次请求都会解析这个文件多达 80 次,直到今天早上我碰巧在开发模式下打开缓存(为了测试其他东西)并注意到 Rails 报告每个请求之间的缓存未命中线。这是加载主页时约 80 个此类通知中的前 4 个:

/Users/evan/Development/Ruby/apps/thefriendex/lib/feeds_mixin.rb:2: warning: already initialized constant DEFAULT_LIMIT
cache: [GET /assets/application.css?body=1] miss
/Users/evan/Development/Ruby/apps/thefriendex/lib/feeds_mixin.rb:2: warning: already     initialized constant DEFAULT_LIMIT
cache: [GET /assets/_have_need_bar.css?body=1] miss
/Users/evan/Development/Ruby/apps/thefriendex/lib/feeds_mixin.rb:2: warning: already initialized constant DEFAULT_LIMIT
cache: [GET /assets/admin.css?body=1] miss
/Users/evan/Development/Ruby/apps/thefriendex/lib/feeds_mixin.rb:2: warning: already     initialized constant DEFAULT_LIMIT
cache: [GET /assets/blurb_ad.css?body=1] miss

所以看起来它正在为每个资产请求重新解析 lib/feeds_mixin.rb 。我曾经有一个配置行将 lib/*.rb 添加到自动加载路径,但我已经删除了它没有效果。

有问题的模块只是一个简单的模块,具有一个常量和三个实例方法。它通过一个简单的包含混合到两个控制器中,如有必要,我可以添加该代码。

关于为什么每次请求资产时都会重新解析此文件的任何想法?

代码:mixin (lib/feeds_mixin.rb)

module FeedsMixin
  DEFAULT_LIMIT = 6

  def friends_feed_items(opts = {})
     # do stuff
  end

  def friends_of_friends_feed_items(opts = {})
     # do stuff
  end

  def community_feed_items(opts = {})
    # do stuff
  end

  def build_feed_hash(type, items, opts) 
    # do stuff
  end
end

代码:包含在哪里(lib/controllers/dashboard_controller.rb)(另一个控制器与这个非常相似)

require 'feeds_mixin'
class DashboardController < ApplicationController

  extend ActiveSupport::Memoizable
  include FeedsMixin
  layout 'dashboard'
  before_filter :require_user, :set_feeds

  LIMIT = 6
  DEFAULT_DATE_THRESHHOLD = 14.days

  def index
  end

  def set_feeds
    @friends_feed = friends_feed_items(:since => since_date, :limit => LIMIT)
    @friends_of_friends_feed = friends_of_friends_feed_items(:since => since_date, :limit => LIMIT)
    @community_feed = community_feed_items(:since => since_date, :limit => LIMIT)
  end

  def since_date
    DEFAULT_DATE_THRESHHOLD.ago
  end
  memoize :since_date
end
4

0 回答 0