2013-11-20 4 views
0

У меня есть приложение, которое использует CacCan и Devise. Я имею Разрабатывают обрабатывать Пользователь уничтожить ДействиеDevise and CanCan не может: уничтожить пользователя

Маршрут

DELETE /users(.:format) devise/registrations#destroy 

Мой контроллер

class UsersController < ApplicationController 
    skip_before_filter :authenticate_user!, :only => :portfolio 

    def index 
    redirect_to dashboard_user_path(current_user) 
    end 

    def dashboard 
    ... 
    end 

    def portfolio 
    end 
end 

Мой ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.role?('Administrator') 
     can :access, :rails_admin 
     can :dashboard 
     can :manage, :all 
    else 
     cannot :destroy, User 
     can :read, :all 
     ... 
    end 
    end 
end 

Этот код выше не работает. Пользователь, который не является администратором, по-прежнему имеет возможность удалять пользователя. Я предполагаю, что причина в том, что у меня нет метода UserController # destroy.

Итак, мой вопрос: как мне заставить CanCan запретить пользователю, который не является администратором, удалять пользователя?

Любая помощь была бы принята с благодарностью.

Благодаря

ответ

0

Мне кажется, что вы определили способности, но не использовать их вообще.

Предлагаю прочитать как минимум this (у gem есть ссылка на wiki с очень полезной информацией, поэтому стоит прочитать все статьи). Я предпочитаю использовать мощный load_and_authorize_resource но в вас случае может быть достаточно authorize! (код не проверяется!)

def destroy 
    @user = User.find(params[:id]) 
    authorize! :destroy, @user 
    ... 
end 
+0

Спасибо за ответ. Я попробовал авторизацию! с load_and_authorize_resource, и удаление все еще происходит для пользователя, который не является администратором. Мне было интересно, есть ли способ реализовать авторизацию для действия, которое вызывается из Devise. Причина, по которой я говорю это; Я мог бы создать метод в моем контроллере и маршрут для этого метода. Затем внесите изменения, которые вы предложили. Но это не помешало бы кому-то запустить devise/registrations # destroy, который удалит пользователя. – user2517182

+0

Я думаю (но я не уверен), что уничтожить маршрут переходит к другому контроллеру/действию. Я нашел несколько примеров: [this] (http://stackoverflow.com/questions/16289299/rails-how-to-destroy-users-created-under-devise) утверждает, что разработка не обеспечивает действие 'destroy', [devise wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Disable-user-from-destroying-his-account) - еще один пример. Я предлагаю проверить, работает ли ваше действие, когда пользователь уничтожает учетную запись, - тогда отладочная способность еще пытается реализовать пример разработки и применить к нему 'authorize'. – gotva

+0

Первая строка в Devise :: RegistrationsController # destroy - ресурс.destroy. Я считаю, что это использование моего метода уничтожения пользователя #. Не уверен, могу ли я использовать первую ссылку, но вторая ссылка на wiki-разработчик кажется многообещающей. Я посмотрю на это и дам вам знать, работает ли это. – user2517182

Смежные вопросы