【问题标题】:Redirect loop when using before_filter in rails 4.2在 Rails 4.2 中使用 before_filter 时重定向循环
【发布时间】:2015-07-21 11:36:42
【问题描述】:

大家好,我想做的很简单。

我想要一个前置过滤器来检查当前用户是否是管理员,即使管理员访问索引页面(例如 localhost:3000,它是普通用户的根 url)也会自动将他重定向到管理面板

对于管理员用户,路径是 localhost:3000/admin/

到目前为止,我已经编写了这些代码块,但会导致重定向循环

在我的 application_controller.rb 我有这个

include SessionsHelper
before_filter :admin_users?


  private
    def admin_users?
      if current_user.admin?
        redirect_to admin_path
      end
    end

current_user 方法如下,在 sessionhelper.rb 中

  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

这里是用户控制器

class UsersController < ApplicationController

  before_filter :admin_users? # application controller method

  before_action :logged_in_user, only: [:index,:edit,:update] # is in Application Controller
  before_action :correct_user, only: [:edit,:update]
  before_action :admin_user, only: :destroy


  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      @user.send_activation_email
      flash[:info] = "Please check your email to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User deleted"
    redirect_to users_url
  end


  private

    def user_params
      params.require(:user).permit(:name,:email,:password,:password_confirmation)
    end

    # before filters


    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
    end

    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end

end

有什么线索吗?

【问题讨论】:

  • 你把before_filter放在哪里了
  • 如 application_controller.rb 中所说
  • 你的方法名是admin_user而不是admin_users?
  • 由于在用户控制器中我已经有一个 admin_user 方法,我将应用程序控制器中的一个更改为 admin_users?反而。但命名似乎不是错误。用正确的名字更新了帖子
  • 最后设置admin_users? 过滤器,但在admin_user 过滤器之前

标签: ruby-on-rails ruby ruby-on-rails-4 admin


【解决方案1】:

接下来是问题。您已将重定向放在 application_controller.rb 中,所有其他控制器都继承自该 application_controller.rb,甚至是 Admin 控制器。

你必须做的下一步:

从您的ApplicationController 中删除before_filter :admin_user,并将其仅放在您要检查用户是否为管理员的位置,除管理员控制器之外的所有控制器。

您有重定向循环,因为当您访问 admin_path 时,管理控制器将重定向到 admin_path。

【讨论】:

  • 我可以做类似 before_filter :admin_user 的事情,除了:[:admin_controller] 吗?
  • 不,将filters 放在application_controller.rb 中不是一个好习惯,您可以保留方法声明,但before_filter 添加到您要检查用户是否为管理员的每个控制器,它是更好的做法
  • 我明白了。好吧,我已经从 applicationcontroller 中删除了过滤器,只留下了方法,并且我已经将过滤器添加到了用户和会话控制器,但现在由于某种原因它甚至没有导致重定向。当我在应用程序控制器中使用过滤器时,即使它导致了重定向循环,它也能正常工作。
  • 刚刚添加到原帖中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多