コントローラーのクラス変数にブロックを格納し、それをインスタンスから呼び出すと、スレッド スコープで問題が発生しますか? ブロックに渡されるパラメーターは、インスタンスごとにローカルです。
コード例は次のとおりです。
class BlockExecutor
def initialize(&block)
self.instance_eval &block
end
def sub_block(&block)
@block = block
end
def call(object)
@block.call(object)
end
end
module ClassDSL
extend ActiveSupport::Concern
module ClassMethods
def define(&block)
@executor = BlockExecutor.new &block
end
def execute_block(object)
@executor.call(object)
end
end
end
class Controller
include ClassDSL
define do
sub_block do |object|
# mutate object
end
end
def run
new_object = self.class.execute_block(object)
end
end