2

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
4

0 に答える 0