如何在一个块中调用`super`

时间:2017-11-01 03:39:11

标签: ruby-on-rails ruby metaprogramming

我有一段代码。那是:

class User < ActiveRecord::Base
  def configuration_with_cache
    Rails.cache.fetch("user_#{id}_configuration") do
      configuration_without_cache
    end
  end
  alias_method_chain :configuration, :cache
end

我想删除臭名昭着的alias_method_chain,所以我决定重构它。这是我的版本:

class User < ActiveRecord::Base
  def configuration
    Rails.cache.fetch("#{id}_agency_configuration") do
      super
    end
  end
end

但它不起作用。 超级进入新范围。我怎么能让它运作?我得到了TypeError: can't cast Class,我误解了它。

2 个答案:

答案 0 :(得分:-1)

你可以在块中使用Super。

请看到这个,任何问题都让我知道。

将其称为“超级”将通过该块。 超级(* args,&amp; block)'也将。

答案 1 :(得分:-1)

首先,在块中调用super确实的行为符合您的要求。必须是您的控制台处于损坏状态(或其他)。

class User
  def professional?
    Rails.cache.fetch("user_professional")  do
      puts 'running super'
      super
    end
  end
end
User.new.professional?
# >> running super
# => false
User.new.professional?
# => false

接下来,这看起来像Module#prepend was made to help with

module Cacher
  def with_rails_cache(method)
    mod = Module.new do
      define_method method do
        cache_key = "my_cache_for_#{method}"
        Rails.cache.fetch(cache_key) do
          puts "filling the cache"
          super()
        end
      end
    end
    prepend mod
  end
end

class User
  extend Cacher

  with_rails_cache :professional?
end
User.new.professional?
# >> filling the cache
# => false
User.new.professional?
# => false