2009-01-26 81 views
0

好的,就像往常一樣,我的應用程序中有一個控制器動作,它受到before_filter未經授權的訪問的保護。唯一的問題是我需要的,如果其他條件爲真重定向這個動作:如何檢查控制器操作是否已重定向?

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語句是正確的。如果是這樣的話,我得到以下錯誤:

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

是否有檢查,以確保我沒有重定向或覆蓋現有的重定向的方法嗎?

回答

3

我假設,如果用戶沒有登錄的login_required方法執行重定向在這種情況下:

你之前過濾器應該調用重定向後返回false。這將阻止從此被調用的新動作。如果您在before_filter中調用渲染或重定向,更高版本的rails會自動執行此操作,因此您可能使用的是舊版本。

另外,您應該在新處理程序中調用重定向之後返回,除非您想始終創建新的Payment對象。

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'方法只重定向/渲染一次,我懷疑你在這裏發佈的代碼不是問題,但是其他的東西導致了這個問題。

0

之前的過濾器是一個紅色的鯡魚。當@order_is_free?代碼既設置重定向,又落入到新的渲染。重定向語句不控制方法的流程。在重定向後添加return語句,或者甚至可以返回重定向,如return(redirect_to :action => :show, :id => @order, :controller => :free_orders)

2

您的類應該是PaymentController,而不是Payment。原因是控制器類和模型類不會發生衝突。

相關問題