好的,通常情况下,我的应用程序中有一个控制器操作,可以防止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
有没有办法检查以确保我还没有重定向或覆盖现有的重定向?
答案 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)