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