2017-10-12 10 views
0

루비에서 예외를 사용하는 것이 좋은가요? (object.nil의 경우 raise ArgumentError 사용)루비 예외 좋은 설명

여기서 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 
+2

이게 진짜 레일입니까? 그렇다면 왜 모델 유효성 검사를 사용하지 않습니까? –

+3

사이드 메모가 있지만'guests = options.has_key? (: guests)? options [: guests] : nil'은 불필요합니다. 알 수없는 키의 해쉬 값은 이미 nil입니다.'guests = options [: guests]' –

+3

내 의견으로 오류를 제기하는 대신 유효성 검사를 사용해야합니다. 죄송합니다. 리팩토링이 필요하다고 생각하기 때문에 답변을 드릴 수 없습니다. – vee

답변

2

이 코멘트에 제안했다, 나는 ActiveRecord 유효성 검사를 사용하는 것이 좋습니다 것 : 여기

http://guides.rubyonrails.org/active_record_validations.html

당신이 질문에 무엇을 요구의 예 :

class Order < ActiveRecord::Base 
    validates :product, presence: true 
    validates :quantity, numericality: { greater_than: 0 } 
    validate :beneficiary_type 

    def beneficiary_type 
    return true unless product.is_a_beneficiary_type? && guests.nil? 
    errors.add(:guests, 'product of beneficiary_type need guests.') 
    end 
end 

Order 인스턴스를 만들 때 해당 유효성 검사를 수행 할 수 있습니다. 예를 들어 컨트롤러 생성 동작 일 수 있습니다.

def create 
    permitted = permitted_params # permit some params 
    @order.new(permitted) 
    if @order.valid? 
    @oder.save! 
    flash[:success] = "Order #{@order.id} has been created!" 
    redirect_to action: :index 
    else 
    render action: :new 
    end 
end 
관련 문제