【发布时间】: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