2014-12-31 3 views
3

데이터를 테이블에 저장하고 있습니다. 는 "question.upvotes"값이 1000000000000000000000 인 경우는 "정수"타입 컬럼에 저장 될 수 없기 때문에레일에 레코드를 저장할 때 오류를 표시하지 않습니다.

Question 
    title:string 
    author_id:integer 
    description:text 
    upvotes:integer 

, 그것은 오류가 발생합니다.

어떻게하면이 오류를 억제 할 수 있습니까? 기록을 저장하지 못했지만 프로그램을 계속 실행하고 싶습니다.

나는이 시도하지만, 오류를 억제하지 않습니다

... some code 

if my_question.save 
end 

some more code... 
+0

어떤 오류가 발생합니까? 업데이트에 실패하면 어떻게됩니까? –

+0

[save'에 대한 문서] (http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save)를 보았습니까? –

+0

@NielsAbildgaard 이것은 적극적인 레코드 .save 메소드에 국한되지 않는 try/catch 구문을 다루는 일반적인 Ruby 질문입니다. –

답변

1
... some code 

begin 
    if my_question.save 
    ... 
    end 
rescue 
    # error handling 
end 

some more code ... 

당신은 ActiveRecord::StatementInvalid: PG::NumericValueOutOfRange: ERROR: integer out of range 오류가 발생합니다. 정확히이 오류를 잡아하려는 경우, 당신은 직접 지정할 수 있습니다

rescue ActiveRecord::StatementInvalid 

은 또한 당신이 언제나 아마도

ensure 

You can find more about exceptions handling here/And see exceptions hierarchy here

+0

레일즈 5.2에서'ActiveModel :: RangeError'가 대신 발생했습니다. 이게 사람 구조 논리를 부서지게 만듭니다. – lulalala

2

으로 실행됩니다 블록을 추가 할 수 있습니다 그 값을 가능한 가장 큰 값으로 고정 시키십니까? Question 모델에 다음을 추가하십시오.

# app/models/question.rb 
UPVOTE_MAX_VALUE = 2_147_483_647   # integer max value in postgresql 
before_validation :check_upvote_max_size 

private 
def check_upvotes_max_size 
    self.upvotes = UPVOTE_MAX_VALUE   if upvotes > UPVOTE_MAX_VALUE 
end 
관련 문제