0
これはRubyでの例外の使用の良い習慣ですか? (object.nilの場合raise ArgumentErrorの使用法)Rubyの例外の良い説明
ここでArgumentErrorを削除してください。 ProductNilErrorのようなカスタム例外を記述すると、QuantityMustBeMoreThanZeroError?
def create_order(product, options = { quantity: 1, guests: nil, confirmation_needed: false })
raise ArgumentError, 'product is nil' if product.nil?
guests = options.has_key?(:guests) ? options[:guests] : nil
quantity = options.has_key?(:quantity) ? options[:quantity] : nil
confirmation_needed = options.has_key?(:confirmation_needed) ? options[:confirmation_needed] : nil
raise ArgumentError, 'quantity must be > 0' if quantity.nil? || quantity < 0 || quantity == 0
raise ArgumentError, 'product of beneficiary_type need guests' if product.is_a_beneficiary_type? && guests.nil?
raise ArgumentError, 'guests do not respond_to each (not an array)' if !guests.nil? && !guests.respond_to?(:each)
raise ArgumentError, 'product of quantity_type do not need guests' if product.is_a_quantity_type? && !guests.nil?
begin
order = build_order(guests, product)
debit_stock(quantity)
pay(order, product, quantity)
confirm_order(order)
ensure
rollback(order, quantity)
end
end
これは本当にレールですか?もしそうなら、なぜモデルバリデーションを使用しないのですか? –
ただサイドノートですが、 'guests = options.has_key?(:guests)? options [:guests]:nil'は不要です。不明なキーのハッシュ値はすでにゼロになっています。あなたは 'guests = options [:guests]' –
と言うことができます。私の意見ではエラーを発生させる代わりにバリデーションを使うべきです。私はそれがいくつかのリファクタリングを取ると信じているので、申し訳ありませんあなたのための答えを持っていません。 – vee