使用rails 3将用户重定向到特定页面

时间:2013-01-16 19:06:17

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我使用设计,我需要将用户从if seller_disabled_paypal_permissions != nil

重定向到特定网页application_controller.rb

我在application_controller.rb上有这段代码

class ApplicationController < ActionController::Base
 before_filter :bad_sellers
 #more code
 .
 .
 .
 private
   def bad_sellers
    if user_signed_in?
     redirect_to requirements_to_sell_user_path, :alert => t('.error') if current_user.seller_disabled_paypal_permissions != nil
     return false
    end
   end
end

但我得到错误:

错误310(net :: ERR_TOO_MANY_REDIRECTS):重定向过多。

我该怎么做?

4 个答案:

答案 0 :(得分:0)

private
   def bad_sellers
    if user_signed_in? && !(current_user.seller_disabled_paypal_permissions.nil?)
     redirect_to root_path, :alert => t('.error')
    end
   end

我从未明确地从before_fiter返回任何值,所以这是我的第一次猜测。

您的问题是您已在ApplicationController上创建了此行为,并且我认为您的根路径也是一个继承自ApplicationController的控制器,因此它将您置于无限重定向循环中。 / p>

你需要这样的东西:

before_filter :bad_sellers, :except => [:whatever_your_root_path_action_is]

答案 1 :(得分:0)

当您有条件重定向时,您可能希望使用return,因此rails不会看到任何其他重定向(不确定如何更好地重定向)。

根据你的例子:

def bad_sellers
  if user_signed_in?
    if !current_user.seller_disabled_paypal_permissions.nil?
      return redirect_to root_path, :alert => t('.error')
    end
  end
end

答案 2 :(得分:0)

看起来它可能是递归的。 root_path还会在过滤之前调用它吗?在这种情况下,您可能希望找到一种不打电话的方法。查看skip_before_filter

此外,您不需要返回虚假的内容。

答案 3 :(得分:0)

解决问题的方法:

applicatio_controller.rb

class ApplicationController < ActionController::Base
 protect_from_forgery
 before_filter :bad_sellers
 #code here
 #code here
 def bad_sellers
  if user_signed_in? && !(current_user.seller_disabled_paypal_permissions.nil?)
   redirect_to requirements_to_sell_user_path(current_user), :alert => t('.error')
  end
 end
end

users_controllers.rb上{users_controllersapplication_controller)的孩子

class UsersController < ApplicationController
 skip_before_filter :bad_sellers, :only => [:requirements_to_sell] #parent filter on application_controller.rb

 def requirements_to_sell
  #more code
  #more code
 end

end