[英]How to call methods in ApplicationController from other controllers?
[英]Call methods from blocks
我正在使用connection_pool來管理與redis的連接,此刻,我需要使用$redis.with {|conn| conn.set("key", 1)}
$redis.with {|conn| conn.set("key", 1)}
來設置密鑰。
我該怎么做
redis.set("key", 1)
並具有與上述代碼行相同的效果。
或至少
redis(set("key", 1))
根據文檔 :
您可以使用
ConnectionPool::Wrapper
來包裝單個全局連接,從而隨着時間的推移可以更輕松地移植連接代碼:$redis = ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.connect } $redis.sadd('foo', 1) $redis.smembers('foo')
包裝器使用method_missing檢出連接,運行請求的方法,然后立即將連接檢回到池中。 它不是高性能的,因此您希望盡快移植對性能敏感的代碼以供使用。
但是我懷疑這只是一個解決方法,您現在的工作方式似乎就是庫設計的工作方式。
盡管我沒有理由按照您的要求進行操作,但我們還是可以:
class << redis
def my_set key, value
$redis.with { |conn| conn.set key, value }
end
end
接着:
redis.my_set 'key', 1
對於所有感興趣的方法:
class << redis
%i(set get foo bar).each do |m|
class_eval <<-CEEOF
def my_#{m} *args
$redis.with { |conn| conn.#{m} *args }
end
CEEOF
end
end
方法列表可以從conn.instance_methods(false)
自動產生。
Ruby方法中接收塊的兩種主要方法:
首先是使用yield關鍵字,如下所示:
def speak
puts yield
end
speak { "Hello" }
# Hello
# => nil
另一種方法是在方法簽名中的最后一個參數前面加上“&”號,然后將根據傳入的任何塊創建Proc對象。
然后可以使用call方法執行該對象,如下所示:
def speak(&block)
puts block.call
end
speak { "Hello" }
# Hello
# => nil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.