2009-05-04 6 views
44

저는 여러 액션을 가진 컨트롤러를 가지고 있습니다 : URL의 속성으로 년과 월을 취합니다. 개인 메소드 check_date를 으로 만들었습니다. 날짜가 유효한지 확인하고 날짜가 미래가 아닌지 확인하십시오. redirect_to 후 컨트롤러 실행을 종료의 레일 방법은redirect_to를 사용한 후 컨트롤러 실행을 어떻게 중지합니까? (레일즈 사용)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

있습니까?

나는 redirect_to 후 예외가 발생하거나 check_date에서 값을 반환하고 호출하는 각 작업에서이를 확인하는 중입니다 생각할 수있는 방법 -

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

같은 것을 그러나이 있는지 궁금해 이 일을하는 데 좋은 레일 방법. 내가 반을했다 그 redirect_to 레일을 호출하는 데 나는 중지 싶었지만, 그 일은 일어나지 않는 것으로 인식하고 싶습니다.

답변

35

아마도 필터를 사용하고 싶을 것입니다.

check_date을 컨트롤러에서 before_filter으로 호출하면 렌더링되거나 리디렉션된다는 사실로 인해 컨트롤러가 액션 메서드를 호출하지 못하게됩니다. 그것은 거기서 끝납니다.

+1

이것은 질문자의 문제를 해결할 수 있지만 여기 vrish88과 같은 해결책을 기대합니다. – iphone007

6

redirect_to는 레일스가 끝날 때 렌더링 할 것을 알려줍니다. Render는 실제로 원하는 것 다음에 다른 렌더링이나 redirect_to 지시어를 추가하면 혼란 스러울 것입니다. 따라서 redirect_to 이후에 컨트롤러에서 돌아와서 작업을 수행하는 '일반적인'레일 방법입니다.

16

당신은 당신의 행동의 코드 실행이 또한 할 수

+4

실제로는 반품 만하겠습니다. – kch

+3

네,하지만 개인 함수에있을 때 나는보다 자동적 인 방법을 찾고 있었기 때문에 반환 값을 검사해야합니다 - 예를 들어 before_filter와 같은 것 –

+0

@HamishDowner이 경우, 개인 함수가 반드시 네이티브 형식의 상태를 반환하게 할 것입니다 그것이하고있는 일, 즉 다른 심볼을 반환하는 심볼, 보통'true'를 반환하는 경우'false', 정상적으로 다른 데이터를 반환하는 경우'nil' 또는 out 변수 나 예외 형태 일 수 있습니다 그게 도우미에게 가장 좋은 것 같으면. 그렇다면 제어기는 사적인 기능이 부정적 상태를 표현하고 그것에 반응해야한다.컨트롤러 메소드의 기능을 개인용 기능과 혼합하면 재 빠르게 사용하기가 쉽지 않을뿐만 아니라 재사용이 어려워집니다. –

47

을 중지 당신이 원하는 목적지

return false 

에 던질 수 :

return redirect_to :action => 'index' 

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

그게 좋을 것 같아서. 자체 회선 (IMHO)에 퍼팅 리턴.

+0

또는'redirect_to : action => 'index'및 return' – Rigo

0

나는 OP가 redirect_to의 기능에 대해 혼란 스럽다고 생각합니다.

redirect_to은 작업이 끝날 때 리디렉션됩니다. 그러나 나머지 제어기 기능은 평상시처럼 실행됩니다. 다른 사람이 올린대로해야 할 일은 다른 함수 호출과 마찬가지로 반환을 포함하는 것입니다.

관련 문제