以管理员身份编辑用户信息

时间:2015-07-18 15:40:11

标签: ruby-on-rails ruby ruby-on-rails-4 authentication devise

我正在通过Rails 4+开展项目,我希望管理员能够编辑用户信息。目前,我在我的用户模型中使用admin作为布尔值(使用Devise时)。管理员帐户当前可以从网站删除用户,但在编辑用户信息时我似乎感到困惑。

我一直在线阅读,我不想使用cancan或其他宝石,因为我认为不是真的需要它?另外我还没有任何代码设置,因为我真的很困惑如何实现这一点。没有找到一个简单/快速的答案,我只是不知道我不知道在哪里/如何开始。

如果你知道如何完成这个和/或任何可以提供帮助的指南,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

这实际上并不难实现。我没有使用CanCan,也没有在我即将向您展示的代码中使用Devise,它都是手动完成的。但是,我仍然认为它可以帮助你...

考虑一个示例 users_controller.rb 文件...

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  .
  .
  def edit
    @user = User.find(params[:id])
  end
  .
  .
  private
    .
    .
    # Confirms that user is correct.
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user) || current_user.admin?
    end

    # Confirms that a user is logged-in
    def logged_in_user
      unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end

    # Below are several methods used in the above two..

    # Logs in the given user.
    def log_in(user)
      session[:user_id] = user.id
    end        

    # Returns true if the given user is the current user.
    def current_user?(user)
      user == current_user
    end

    # Returns the user corresponding to the remember token cookie.
    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

    # Returns true if the user is logged in, false otherwise.
    def logged_in?
      !current_user.nil?
    end

如果仔细查看控制器文件的顶部,您会发现before_action这是一个命令,它安排在允许给定操作发生之前调用特定方法。

因此,在before_action :correct_user, only: [:edit, :update]行中,我要求Rails做的是在更新或编辑用户信息之前检查用户是否正确。

根据我对correct_user ...

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

...正确的用户 持有此帐户的用户管理员。结果不会将我重定向到根页面,而是让我编辑用户的问题页面。

我希望这可以帮助你。

<强>更新

  

当管理员编辑用户信息时,他们不必知道密码才能这样做。这是以某种方式在您的代码中实现的,或者如何绕过它?

首先,我实际上无法看到密码,因为它存储为摘要,然而如果您甚至不想让管理员编辑密码,那么你应该做的是以下......

edit.html.erb 中,只需将密码字段放在if语句中...

<% if !current_user.admin? %>

    <%= f.label :password %>
    <%= f.password_field :password %>

    <%= f.label :password_confirmation, "Confirmation" %>
    <%= f.password_field :password_confirmation %>

<% end %>

......就是这样。

如果我想看到用户信息安全的证据,我们可以查看控制台......

2.2.1 :001 > User.first
  User Load (0.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1 OFFSET 1
 => #<User id: 1, name: "Fake User", email: "fake@fakemail.org", created_at: "2015-07-11 18:36:00", updated_at: "2015-07-11 18:36:00", password_digest: "$2a$10$RpVWwRKWIQObTDow3PLGWOgjxqNNK.LU8p.fEPOVVnT...", remember_digest: nil, admin: nil, activation_digest: "$2a$10$jUZiRIiiBnpCSEv0h/KKi.fqdW3hVn94XFxxQS.n62X...", activated: true, activated_at: "2015-07-11 18:36:00", reset_digest: nil, reset_sent_at: nil> 

答案 1 :(得分:0)

我建议你查看active_admin,你可以很容易地完成它。

对于rails 4,您只需要使用master分支。

gem 'activeadmin', github: 'activeadmin'

了解更多信息see docs here