Другой подход заключается в использовании области действия по умолчанию для вашей модели.Определите состояние для вашей модели User и добавьте область по умолчанию (Rails 3), это будет охватывать все запросы в модели User с условием из области:
app / models / user.rb
class User < ActiveRecord::Base
default_scope where("state != 'disabled'")
def disable!
self.update_attribute(:state, 'disabled')
end
end
Затем переписать метод destroy в контроллере сеанса, убедитесь, что вы получили код уничтожения из используемой вами версии устройства:
* app / controllers / registrations_controller.rb *
class Users::RegistrationsController < Devise::RegistrationsController
# paranoid DELETE /resource
def destroy
resource.disable! # we don't remove the record with resource.destroy
Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
set_flash_message :notice, :destroyed if is_navigational_format?
respond_with_navigational(resource){ redirect_to after_sign_out_path_for(resource_name) }
end
end
Вы можете сделать еще один шаг, определив конечный автомат в своей модели пользователя (будьте осторожны, чтобы не каскадироватьдерево зависимостей, как :dependent => :destroy
):
app / models / user.rb
class User < ActiveRecord::Base
include ActiveRecord::Transitions
state_machine do
state :passive
state :active
state :disabled, :enter => :bye_bye_user
event :activate do
transitions :from => :passive, :to => :active
end
event :disable do
transitions :from => [:passive,:active], :to => :disabled
end
end
default_scope where("state != 'disabled'")
end