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