2014-04-08 5 views
4

albums_controller.rb의 모든 예외 :캐치 레일 컨트롤러의 before_action

lass AlbumsController < ApplicationController 
    before_action :set_album, only: [:show, :edit, :update, :destroy] 

    def destroy 
    if @album.destroy 
     redirect_to albums_url, notice: 'Album was successfully destroyed.' 
    else 
     redirect_to albums_url, error: 'Album destroy failed.' # _DEST_ 
    end 
    end 

private 
    def set_album 
     @album = Album.find(params[:id]) # _FIND_ 
    end 
end 

나는 Album.find()에 대한 예외를 잡을 싶습니다. this에 따르면 나는 추가 :

rescue_from Exception, with: :flash_error 

    # private 
    def flash_error 
     flash_message :error, 'Something went wrong..' # _FLASH_ 
    end 

나는 같은 _FIND_, _FLASH_, _DEST_ 위의 일부를 표시하고 그 순서대로 모두 통과하고 싶습니다. 방아쇠를 당기기 위해 존재하지 않는 앨범을 삭제하려고했습니다. 앨범/(: id) (내가 삭제하려고 시도한 URL)에 대한 URL이있는 빈 페이지가있어서 _FLASH_ 부분에 붙어 있다고 가정합니다.

destroy 동작 (다른 컨트롤러 동작에 대한 다른 예외도 catch 할 수 있으므로 rescue_form이라는 원래의 동작)을 호출하려면 어떻게해야합니까? 그리고 Something went wrong보다 더 좋은 메시지를 얻으려면 어떻게해야합니까?

주요 목표는 올바른 페이지 (_DEST_으로 지정)로 리디렉션하는 것이므로 더 나은 방법이 될 수 있습니다.

+1

'rescue_from ActiveRecord :: RecordNotFound with : : rescue_action'을 사용 해보세요 : –

+0

많은 변화가 없으며 여전히'_DEST_'에 계속되지 않습니다 – pawel7318

답변

1

"rescue_from"콜백 메소드 "flash_error"는 사용자 관점에서 빈 페이지 렌더링을 종료하는 일반적인 컨트롤러 동작처럼 동작합니다. 그런 의미에서 거기에 붙어 있지 않습니다, 거기서 끝납니다.

"진행하려면"리디렉션하거나 렌더링해야합니다. 그 예외가 당신이 무슨 일이 있었는지에 대한 자세한 내용을 얻을 수 있도록 전파됩니다주의 :

#I am using Rails 3.2 flash notation 
def flash_error(exception) 
    flash[:error] = "#{exception.message} (Something went wrong..)" # _FLASH_ 
    redirect_to albums_url 
end 

내 조언은 모든 예외를 잡기 위해 결코 없다. 내 경험상 슬픔 외에는 아무것도 나오지 않았다. 인덱스 작업에서 예외가 발생했다면 루프에서 끝날 것이라고 상상해보십시오.

+0

좋은 소리지만'set_album' (당신은'before_action'에서 그것을 볼 수 있습니다) 그리고 모든 다른 redirect_to 목적지를 가지므로'flash_error'에 하나의'redirect_to'를 넣을 수 없습니다. 어떤 주요 동작이 호출되었는지 확인하는 방법이 있습니까? flash_error에서 호출하거나'redirect_to'를'case'와 함께 호출 할 수 있습니다. – pawel7318

+0

exception.backtrace에서 일부 정보를 얻을 수 있지만, 예외적 인 상황이 발생하면 왜 사용자 정의 작업을 수행 할 것인지 확신 할 수 없습니다. 쇼 동작을 원하고 앨범이없는 경우 복구 시나리오는 무엇입니까? – drKreso

+0

나는 모든 것을 생각하고 네가 옳아. 우선 그것은 예외적이므로 자주 발생하지 않아야합니다. 두 번째로 앞으로는 아약스로 이동하여 사용자에게 플래시 메시지를 표시하는 데 필요한 페이지 리디렉션이나 다시 렌더링이 필요 없습니다. [다른 질문] (http://stackoverflow.com/questions/23001377/rspec-feature-test-issue)을 확인해 주시면 감사하겠습니다. – pawel7318

관련 문제