2013-04-27 3 views
0

У меня есть приложение Rails 3.2.x с помощью Devise.Предотвращение удаления пользователя в Ruby On Rails и разработка приложения

В соответствии со стандартной функцией разработки пользователь может удалить свою учетную запись (есть кнопка, чтобы щелкнуть по экрану смены пароля).

Я хочу, чтобы пользователь не удалял свою учетную запись, если он совершил предыдущие транзакции в системе.

Так что я сделал следующее в модели пользователя

before_destroy do 
    # Only delete if no financial transactions exist 
    return false if Trxhistory.where(:user_id=>self.id).select(:id).count() != 0 
end 

Он работает, пользователь будет удален, если никаких операций не существует, и пользователь не удаляется, если транзакция не существует. НО: если пользователь не будет удален, на экране по-прежнему отображается сообщение об успешном удалении, а не сообщение об ошибке.

+0

Можете ли вы показать код контроллера? – Bob

+0

Я использую стандартный Devise, я не перезаписал их контроллер. – KKK

+0

Я думаю, вы должны сделать это, чтобы обработать исключение и показать сообщение об ошибке. – Bob

ответ

2

Чтобы иметь такую ​​настройку. Я считаю, что вам придется перезаписать контроллер регистрации разработки.

Хорошей новостью является то, что это не сложно. все, что вам нужно сделать, это создать новый контроллер в вашем приложении, который станет новым контроллером регистрации для этого пользователя. например.

bundle exec rails generate controller users/registrations 

Он должен будет наследовать от Devise: RegistrationsController

class Users::RegistrationsController < Devise::RegistrationsController 

end 

наконец вы будете ссылаться на этот контроллер в качестве нового контроллера регистрации в вашем routes.rb файл так же, как devise page says

devise_for :users, controllers: { registrations: "users/registrations"} 

Теперь вы можете реализовать свое настраиваемое правило для этого ресурса. т.е.

class Users::RegistrationsController < Devise::RegistrationsController 

    def destroy 
    if resource.didsomething 
     redirect_to root_path, flash: { error: "You can't delete your account" } 
    else 
     super 
    end 
    end 
end 

метод выше перезапись метод по уничтожению по умолчанию в завещанию и вызвать оригинал, только если условие не выполнено.

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