0

Rails 3プロジェクトにデバイスをインストールして構成しましたが、管理者だけがユーザーを作成/編集できるようにしたいと思います。これを実現するためにデバイスコントローラを編集するにはどうすればよいですか?

4

3 に答える 3

1

そのためにCanCanを使用することをお勧めします。

まず、、、などの能力を定義し:read、次のようなものを使用してそれらをユーザーロールに割り当てます。:create:update:destroy

if user.admin?
  can :manage, :all
end

次に、などを使用してユーザーを作成/編集する権限があるかどうかを確認することで、これらの機能if can? :create, Userを確認します。

于 2013-01-15T04:42:08.903 に答える
0

管理者がユーザーを作成できるようにするだけでよい場合は、次のように記述できます。

class uUsersController < ApplicationController
  def create
     #validate if the current user is an admin 
  end
end 

しかし、より標準的で柔軟な方法は、cancanのような宝石を使用することです。これは個人的には好きです:)

于 2013-01-15T04:37:15.363 に答える
0

私は以前にこれを整理しました。苦痛だったのを覚えていますが、うまくいきます。CanCanが必要です。

管理者がモデルのadminブール値で定義されているとすると、次のようになります。User

user.rb:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :current_password
  attr_accessible :name, :password, :password_confirmation, :current_password, :email, :remember_me, :admin

end

class Ability
    include CanCan::Ability

    def initialize(user)
    can :manage, :all if user.admin
  end
end

users_controller.rb

def update
  @user = User.find(params[:id])
  params[:user].delete(:password) if params[:user][:password].blank?
  params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank?
  if @user.update_attributes(params[:user])
    flash[:notice] = "Successfully updated "+@user.name
    redirect_to users_path
  else
    render :action => 'edit'
  end
end

ルート.rb

devise_for :users, :path => "d"

devise_scope :user do
  get '/sign_in' => 'devise/sessions#new'
  get '/sign_out' => 'devise/sessions#destroy'
end

resources :users, :controller => "users"

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery

  after_filter :user_activity

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_path
  end

  def admin?
    self.admin == true
  end

  def authenticate_admin
    redirect_to :new_user_session_path unless current_user && current_user.admin?
  end

  private

  def user_activity
    current_user.try :touch
  end

end

application_helper.rb

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

それはそれをする必要があります。

于 2013-01-15T04:39:07.007 に答える