我将Prawn-Rails与PrawnRailsForms一起扩展。我希望这些方法只能在给它们一些上下文的块中使用。例如,我的分机的使用可能看起来像:如何使用助手对象扩展Ruby库
field_row height: 25, units: 8 do
text_field field: 'Favorite fruit', # ...
end
这在底层工作在我的图书馆的方式是field_row
方法实例化一个辅助对象,否则其他的方法,如text_field
,不运行:
class FieldRow
# ...
end
class PrawnRails::Document
attr_accessor :field_row # my helper object
def field_row(height:, units:, &block)
@field_row = FieldRow.new #...
block.call
@field_row = nil
end
def text_field(**args)
unless @field_row.present?
raise ArgumentError, 'Must be inside a field row'
end
# implementation which relies on @field_row...
end
end
有以确保当FieldRow
对象可用我的方法是只运行一个更好的办法吗?特别是,在block.call
之后必须编写@field_row = nil
,这让我觉得自己做错了一些事情。
嗯,除了'text_field'需要是'PrawnRails :: Document'的实例方法,以便它可以在文档上操作(创建框,添加文本,样式等)。 – dfaulken
@dfaulken您可能希望了解一下Prawn本身是如何实现类似的方法的,因为它可能有一个既定的约定(或者甚至可以搭载一些方便的功能),但我已经编辑了我的答案以包含几个可能的解决方案。 –
这是一个很好的建议。感谢您分享这么多想法! – dfaulken