web-dev-qa-db-ja.com

redirect_toを使用した後、コントローラーの実行を停止するにはどうすればよいですか? (Railsの使用)

URLの属性として:yearと:monthを使用する複数のアクションを持つコントローラーがあります。私はプライベートメソッドcheck_dateを作成して、日付が有効であること、および日付が未来でないことを確認しています。

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

Rails 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

しかし、私はいくつかのニースRailsこれを行う方法があります。redirect_toRailsが呼び出されて、私が停止したいと認識したことを認識するでしょうが、起こらないようです。

44
Hamish Downer

おそらくフィルターを使いたいでしょう。

check_date として before_filterコントローラーでは、レンダリングまたはリダイレクトされるため、コントローラーがアクションメソッドを呼び出すことができなくなります。それはそこで終わります。

36
kch

次のこともできます:

return redirect_to :action => 'index'

そして

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

それはそれ自身の行にリターンを置くよりも見栄えが良いからです(IMHO)。

48

投入できます

return false

アクションのコード実行を停止したい場所

16
vrish88

redirect_toは、Railsレンダリングの終了時に何をレンダリングするかを指示します。Railsは、本当に必要なものの後に他のrenderまたはredirect_toディレクティブを追加すると混乱するので、 redirect_toの後にコントローラーから戻る-これは「通常」のRails方法です。

7

OPはredirect_toの機能について混乱していると思います。

redirect_toは、アクションの最後にリダイレクトされます。ただし、残りのコントローラー機能は通常どおり実行されます。他の人が投稿したように、他の関数呼び出しと同じように、リターンを含めるだけです。

2
Tristan Tao