Ruby 2.1.5 および 2.2.4 では、新しい Collector を作成すると正しい結果が返されます。
require 'ostruct'
module ResourceResponses
class Collector < OpenStruct
def initialize
super
@table = Hash.new {|h,k| h[k] = Response.new }
end
end
class Response
attr_reader :publish_formats, :publish_block, :blocks, :block_order
def initialize
@publish_formats = []
@blocks = {}
@block_order = []
end
end
end
> Collector.new
=> #<ResourceResponses::Collector>
Collector.new.responses
=> #<ResourceResponses::Response:0x007fb3f409ae98 @block_order=[], @blocks= {}, @publish_formats=[]>
Ruby 2.3.1 にアップグレードすると、代わりに nil が返され始めます。
> Collector.new
=> #<ResourceResponses::Collector>
> Collector.new.responses
=> nil
OpenStruct が 2.3 で 10 倍速くなった方法について多くのことを読みましたが、Collector と Response の関係を壊すような変更が行われたことはわかりません。どんな助けでも大歓迎です。Rails のバージョンは 4.2.7.1 です。