0

よくあることですが、私のアプリには before_filter によって不正アクセスから保護されたコントローラー アクションがあります。唯一のことは、別の条件が true の場合にこのアクションをリダイレクトする必要があることです。

class Payment < ApplicationController
  before_filter login_required

  def new
    redirect_to some_other_path if @order.is_free?
    @payment = Payment.new
  end
end

私のテストでは、アクションが正しく保護されていることを確認していますが、@order.is_free ステートメントが true である場合も同様です。この場合、次のエラーが発生します。

`render_with_no_layout': Can only render or redirect once per action

まだリダイレクトしていないことを確認したり、既存のリダイレクトを上書きしたりしないようにする方法はありますか?

4

4 に答える 4

3

ユーザーがログインしていない場合、 login_required メソッドがリダイレクトを実行すると想定しています。その場合:

リダイレクトを呼び出した後、前のフィルターは false を返す必要があります。これにより、新しいアクションが呼び出されなくなります。新しいバージョンの Rails では、レンダーまたはリダイレクトを before_filter で呼び出すと自動的にこれが行われるため、古いバージョンを使用している可能性があります。

また、常に新しい Payment オブジェクトを作成する場合を除き、新しいハンドラーでリダイレクトする呼び出しの後に戻る必要があります。

于 2009-01-26T12:56:38.010 に答える
2

クラスは Payment ではなく、PaymentController である必要があります。これは、コントローラ クラスとモデル クラスが衝突しないようにするためです。

于 2009-01-27T03:07:30.960 に答える
0

前のフィルターが二重レンダリングエラーの原因だとは思いません。次の例を見てください。

class PostsController < ApplicationController
  before_filter :perform_a_redirect, :except => [:wtf]

  def index
    redirect_to 'http://google.com'
  end

  def wtf
    render :text => 'wtf'
  end

  private

  def perform_a_redirect
    redirect_to :action => 'wtf'
  end
end

/posts にアクセスすると、/posts/wtf にリダイレクトされます。二重レンダリング エラーはありません。「login_required」メソッドが一度だけリダイレクト/レンダリングすると仮定すると、ここに投稿しているコードは問題ではなく、他の何かが原因であると思われます。

于 2009-01-26T11:50:48.937 に答える
0

before フィルターは厄介者です。@order_is_free?コードがリダイレクトの設定と new のレンダリングの両方を行っている場合。リダイレクト ステートメントは、メソッドの流れを制御しません。リダイレクトの後に return ステートメントを追加するか、次のようにリダイレクトを返すこともできますreturn(redirect_to :action => :show, :id => @order, :controller => :free_orders)

于 2009-01-26T17:25:30.680 に答える