2017-09-16 82 views
0

我跟着这link找出如何让管理员批准新用户。我在我的User模型上有一个approved属性,它是一个布尔值。管理员更改用户的审批状态 - Rails +设计+ Cancancan

2个问题 - 1)当我以管理员身份登录并通过link_to "Edit", edit_user_path(user)转到编辑用户以更改已批准的用户时 - 该URL适用于正确的用户,但随后更新操作尝试更新当前的管理员用户。

2)我希望有需要的当前密码的覆盖,所以我已经把方法在Registrations控制器做以下这一点,但得到这个错误:

错误:unknown attribute 'current_password' for User.

所以它不会覆盖current_password,它不会更新正确的非管理员用户 - 我在哪里出错?

class Ability 
     include CanCan::Ability 

     def initialize(user) 

     current_user ||= User.new # guest user (not logged in) 
     if current_user.admin == true 
      can :manage, :all 
     else 
      can :manage, User, id: user.id 
     end  
     end 
    end 

路线

Rails.application.routes.draw do 
    devise_for :users, controllers: { registrations: 'registrations' } 
    resources :users 
end 

控制器

class RegistrationsController < Devise::RegistrationsController 

    def update_resource(resource, params) 
    resource.update_without_password(params) if current_user.admin == true 
    end 
end 

回答

0

我花了很多时间试图解决这个问题,并没有在网上找到任何明确的,终端到年底完成这样的例子我将所有内容都放在下面,所以任何新用户到RoR/Devise希望不会有同样的问题。

假设DeviseUser模型上。 确保您的Cancancan已相应设置。一些与此类似:

型号/ ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Define abilities for the passed in user here. For example: 
    # 
    current_user ||= User.new # guest user (not logged in) 
    if current_user.admin 
     can :manage, :all 
    else 
     can :manage, User, id: user.id 
    end 
end 
end 

按照here

步骤他提到有一个“管理员访问的唯一的页面。万一有人不知道如何做到这一点:

class UsersController < ApplicationController 
    before_action :admin?, only: :index 

    def index 
    if params[:approved] == false 
     @users = User.where(approved: false) 
    else 
     @users = User.all 
    end 
    end 

private 
    def admin? 
    redirect_to '/login' unless current_user.admin == true 
    end 

end 

替换该行(我用.erb,因为他在这个链接不.haml)%td= link_to "Edit", edit_user_path(user)这一点: <%= User.approved%>

  <td> 
      <% if !User.approved %> 
       <%= link_to "Approve User", user_path(:id => user.id, "user[approved]" => true), :method => :patch, class: "btn btn-success" %> 
      <% else %> 
       <%= link_to "Unapprove User", user_path(:id => user.id, "user[approved]" => false), :method => :patch, class: "btn btn-danger" %> 
      <% end %> 
      </td> 

这实际上给你一个按钮,单击时,将批准用户,反之亦然。在这里,我绊倒了好几天的关键是A)你必须确保你的表格(在这种情况下,link_to打用户控制器,而不是RegistrationsController#update方法。

我知道有些人在网上联系了指示创建一个Registrations模型和改变路线,覆盖模型等

说实话,我的最终解决方案并不需要任何的。希望这有助于!

相关问题