gpt4 book ai didi

ruby-on-rails - 如何在 block 中调用 `super`

转载 作者:太空宇宙 更新时间:2023-11-03 16:59:34 26 4
gpt4 key购买 nike

我有一段代码。这是:

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

但它不起作用。 super 进入一个新的范围。我怎样才能让它工作?我遇到了 TypeError: can't cast Class,我误解了它。

最佳答案

首先,在 block 中调用 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

关于ruby-on-rails - 如何在 block 中调用 `super`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47047866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com