2

Rails3.0.9とcancan1.6.7およびdevice1.4.8を使用しています

私はそれを疑っています、缶/缶ですか?/できない/できない?メソッドはcurrent_abilityメソッドを呼び出します。

カンカンのcurrent_abilityメソッドを上書きするcurrent_abilityメソッドをアプリケーションコントローラーに記述しました

apllication_controller.rb内

    def current_ability
      if current_user.kind_of(User)
        @current_ability ||= UserAbility.new(current_user)
      else
        @current_ability ||= AdminAbility.new(current_admin)
      end
    end

このメソッドは、ページリクエストごとに44回呼び出されることがわかりました

ログイン後にロードされたインデックスページには、35のメニュー項目(can?メソッドを使用してロード)と3つのアクション(can?メソッドを使用してロード)を含むコンテンツが含まれています。なぜcurrent_abilityメソッドが44回呼び出されるのですか?

4

1 に答える 1

4

はい。Everycan? cannot?とメソッドをauthorize!呼び出します( CanCanのcontroller_additions.rbを参照) 。current_ability

また、への44回の呼び出しについても心配する必要はありませんcurrent_ability||=コントローラーでオペレーター(メモ化)を使用してインスタンス変数を使用しているため、リクエストごとに1つのAbilityオブジェクトのみを作成しています。パフォーマンスに大きな影響はありません。

たとえば、同じキャッシュオブジェクトを100,000回フェッチするための簡単なベンチマークを実行してみましょう...

require "benchmark"

def cached_object
  @foo ||= String.new('foobar')
end

cached_object.object_id.to_s(16)   # => 3ffc5cc53cb0
cached_object.object_id.to_s(16)   # => 3ffc5cc53cb0 (same object is returned)

Benchmark.bm(7) do |b|
  b.report("Cached Object") { 100000.times {cached_object}}
end

#               user     system   total     real
# Cached Object 0.010000 0.000000 0.010000 (0.017291)
于 2013-01-12T06:02:35.747 に答える