2009-05-04 3 views
44

私は、URLから という年と月を取る複数のアクションを持つコントローラを持っています。私はプライベートメソッドcheck_dateを にしました。日付が有効であることを確認し、日付が将来でないことを確認してください。redirect_toを使用した後、コントローラの実行を停止するにはどうすればよいですか? (Railsの使用)

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後、コントローラの実行を終了するレールの方法はありますか?

私は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は、終了時に何をレンダリングするかを指示します。あなたが本当に必要なものの後に他のレンダリングまたはredirect_toディレクティブを追加すると、Railsは混乱します。したがって、redirect_toの後にコントローラから戻ってくるだけです。

16

あなたのアクションでコード実行あなたはまた、行うことができます

+4

実際、返品のみいたします。 – kch

+3

はい、プライベート関数では戻り値をチェックする必要がありますので、before_filterのように、より自動的な方法を探していました。 –

+0

@HamishDownerこの場合、私はprivate関数をフォーム固有の状態に戻すことは間違いありません他のシンボルを返す場合はシンボル、通常は '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は、アクションの最後にリダイレクトされます。ただし、残りのコントローラ機能は通常通り実行されます。他の人が投稿したようにしなければならないことは、他の関数呼び出しと同じように、リターンを含めることです。