복붙노트

[RUBY-ON-RAILS] 레일 2 : Model.find (1) ID 1이 존재하지 않는 액티브 오류를 제공합니다

RUBY-ON-RAILS

레일 2 : Model.find (1) ID 1이 존재하지 않는 액티브 오류를 제공합니다

나는 레일 2.3.5을 사용하고있는하고 그 내가 Model.find (1)을주고 1은 데이터베이스에없는 경우는 액티브 오류를 반환합니다. 그냥 Model.find_by_column의 경우로 전무를 반환해야한다 ( '..')?

해결법

  1. ==============================

    1.이것은 예상 된 동작입니다. 나는 다윗이, 그래서 여기에 자신이 최선의 설명 루비, S., 토마스, D. & 한손, DH, 레일과 2009 년 애자일 웹 개발에서 인용 한 생각 3 판 제 3 판., 실용적인 책장 (p.330) .

    이것은 예상 된 동작입니다. 나는 다윗이, 그래서 여기에 자신이 최선의 설명 루비, S., 토마스, D. & 한손, DH, 레일과 2009 년 애자일 웹 개발에서 인용 한 생각 3 판 제 3 판., 실용적인 책장 (p.330) .

  2. ==============================

    2.당신이 정말로 예외를 원하지 않는 경우, 당신은 find_by_id 사용할 수 있습니다 :

    당신이 정말로 예외를 원하지 않는 경우, 당신은 find_by_id 사용할 수 있습니다 :

    # @user = User.find(params[:id])    # original code
    @user = User.find_by_id(params[:id])
    if @user
        # found!
    else
        # not found
    end
    

    이것은 빠르게 별도의 존재보다 더해야 하는가? 검사.

    편집 : 참고 @Miguelgraz은 주석으로, 레일 4 대신 User.find_by 말을해야한다고 (ID : PARAMS를 [: ID]). 같은 기능을하지만 지금은 구현이 필요하지 않습니다 method_missing.

  3. ==============================

    3.예외를 던지는 것은 예상 된 동작입니다.

    예외를 던지는 것은 예상 된 동작입니다.

    당신이 허락한다면 사실 이벤트의 정상적인 과정에서 예외 이동은 레일 서버가 적절한 404 페이지를 찾을 수 없습니다 오류를 반환합니다 처리되지 않은.

    당신이 반환에 대한 원한다면 당신은 스스로를 잡을 수 전무 :

    begin
      @model = Model.find(id_provided)
    rescue ActiveRecord::RecordNotFound => e
      @model = nil
    end
    
  4. ==============================

    4.당신은 예외가 파인더 방법 find_by_attributes 맛에 던져 질하려면, 당신은 강타를 사용할 수 있습니다! 방법의 버전.

    당신은 예외가 파인더 방법 find_by_attributes 맛에 던져 질하려면, 당신은 강타를 사용할 수 있습니다! 방법의 버전.

    예를 들어,

    Model.find_by_category!(a_category_value)
    

    일치하는 항목이없는 경우 RecordNotFound 발생합니다.

    나는 예외에 대한 일반적인 오류 처리기를 가지고 있고 지정된 매개 변수와 일치하는 리소스가 발견되지 않을 때 내 행동이 일관되게 행동 할 편안하고 컨트롤러와 같은 상황이 될 DRY를 발견했다.

  5. ==============================

    5.레코드를 가져 오는 전에 존재하는지 확인할 수 있습니다.

    레코드를 가져 오는 전에 존재하는지 확인할 수 있습니다.

    @model = Model.find(id) if Model.exists?(id)
    
  6. ==============================

    6.4 방법은 레일

    4 방법은 레일

    if user = User.find_by(id: params[:id]) 
      #do something with user
    else
      #throw error or redirect
      raise ActiveRecord::RecordNotFound
    end
    
  7. ==============================

    7.당신은 (귀하의 경우 ID를) 필요한 속성으로 find_by 사용할 수있는이 지정된 ID를 찾을 수없는 경우 오류를주는 대신 nil을 반환합니다.

    당신은 (귀하의 경우 ID를) 필요한 속성으로 find_by 사용할 수있는이 지정된 ID를 찾을 수없는 경우 오류를주는 대신 nil을 반환합니다.

    Model.find_by_id(id_value)
    

    당신은 또한 어디에 사용할 수 있지만 0 개 이상의 레코드와 활성 기록 관계를 반환 위치를 제로 레코드를 반환하는 경우에 하나 개의 레코드 만 또는 전무를 반환 처음 사용할 필요가 있음을 알아야합니다.

    Model.where(id: id_value).first
    
  8. ==============================

    8.당신은 간단하게 사용할 수 있습니다 :

    당신은 간단하게 사용할 수 있습니다 :

    user = User.find(10) rescue nil
    
  9. from https://stackoverflow.com/questions/4966430/rails-2-model-find1-gives-activerecord-error-when-id-1-does-not-exist by cc-by-sa and MIT license