如何检查控制器操作是否已重定向?

时间:2009-01-26 11:31:23

标签: ruby-on-rails ruby redirect controller

好的,通常情况下,我的应用程序中有一个控制器操作,可以防止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

有没有办法检查以确保我还没有重定向或覆盖现有的重定向?

4 个答案:

答案 0 :(得分:3)

我假设如果用户未登录,login_required方法会执行重定向。在这种情况下:

调用重定向后,您的前置过滤器应返回false。这将阻止调用新操作。如果您在before_filter中调用渲染或重定向,则更高版本的rails会自动执行此操作,因此您可能使用旧版本。

此外,您应该在新处理程序中重定向调用后返回,除非您想要始终创建新的Payment对象。

答案 1 :(得分:2)

您的课程应该是PaymentController,而不是Payment。这样做的原因是控制器类和模型类不会冲突。

答案 2 :(得分: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 / wtf。没有双重渲染错误。假设你的'login_required'方法只重定向/渲染一次,我怀疑你在这里发布的代码不是问题,但是其他东西导致了这个问题。

答案 3 :(得分:0)

前过滤器是红鲱鱼。当@order_is_free?代码同时设置重定向并进入新的渲染时。 redirect语句不控制方法的流程。重定向后添加一个return语句,或者甚至可以返回重定向,如return(redirect_to :action => :show, :id => @order, :controller => :free_orders)