我一直想知道在初始化程序中获取记录很常见吗?
这是服务对象获取记录和生成pdf收据文件的示例。
输入是发票uuid
,并获取相关记录,例如卡片详细信息,初始化内的发票项目。
class Pdf::GenerateReceipt
include Service
attr_reader :invoice, :items, :card_detail
def initialize(invoice_uuid)
@invoice ||= find_invoice!(invoice_uuid) # caching
@items = invoice.invoice_items
@card_detail = card_detail
end
.....
def call
return ReceiptGenerator.new(
id: invoice.uuid, # required
outline: outline, # required
line_items: line_items, # required
customer_info: customer_info
)
rescue => e
false, e
end
.....
def card_detail
card_metadata = Account.find(user_detail[:id]).credit_cards.primary.last
card_detail = {}
card_detail[:number] = card_metadata.blurred_number
card_detail[:brand] = card_metadata.brand
card_detail
end
end
Pdf::GenerateReceipt.('28ed7bb1-4a3f-4180-89a3-51cb3e621491') # => then generate pdf
问题是如果找不到记录,则会产生错误。 我可以在初始化程序中进行救援,但这似乎并不常见。
我怎么能以更红宝石的方式解决这个问题?
答案 0 :(得分:1)
这主要是意见和轶事,但我更倾向于尽可能地将我的价值观投射到链上。所以我会在这个对象之前找到发票并将其作为参数传递,与card_detail相同。
如果你在这个课程中这样做,它将限制协调这两个对象的责任,这更容易测试,但也增加了你将来必须推理的另一个层。
所以我将如何处理,将其分成4个单独的东西
将发票和卡作为参数的Pdf Generator
最后,要编排上述3个动作
希望这有帮助。
另外:用avdi grimm查看书中的自信红宝石。概述处理这种情况非常棒。