2017-09-16 140 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模型和改變路線,覆蓋模型等

說實話,我的最終解決方案並不需要任何的。希望這有助於!

相關問題