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

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

4

4 回答 4

3

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

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

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

于 2009-01-26T12:56:38.010 回答
2

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

于 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

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

于 2009-01-26T17:25:30.680 回答