Rails バージョン: 3.1 Ruby バージョン: 1.9.2
私の現在のプロジェクトの 1 つで、すべてのリクエストのログに「警告: 既に初期化された定数」行が何十行も表示されます。問題の定数は、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 を追加する構成行がありましたが、それを削除しても効果はありませんでした。
問題のモジュールは、1 つの定数と 3 つのインスタンス メソッドを持つ単純なモジュールです。簡単なインクルードを介して 2 つのコントローラーに混合されます。必要に応じてそのコードを追加できます。
アセットがリクエストされるたびにこのファイルが再解析される理由について何か考えはありますか?
コード: ミックスイン (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) (他の 1 つのコントローラーはこれと非常によく似ています)
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