【问题标题】:How do I check if a controller action is already redirecting?如何检查控制器操作是否已经重定向?
【发布时间】:2009-01-26 11:31:22
【问题描述】:

好的,通常情况下,我的应用中有一个控制器操作,它受到 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

有什么方法可以检查以确保我没有重定向或覆盖现有的重定向?

【问题讨论】:

    标签: ruby-on-rails ruby redirect controller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我认为您的前置过滤器不是导致双重渲染错误的原因。看看这个例子:

        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”方法只重定向/渲染一次,我怀疑您在此处发布的代码不是问题,而是其他原因造成的。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2015-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-15
            • 1970-01-01
            • 2021-09-22
            相关资源
            最近更新 更多