我目前在Rails项目中使用Desive进行用户注册/身份验证.当用户想要取消其帐户时,用户对象将被销毁,这会使我的应用程序处于不希望的状态.

实现"软删除"的最简单方法是什么,即仅删除个人数据并将用户标记为已删除?我仍然想保留所有记录关联.

我想我必须首先为用户引入一个新的"已删除"列.但是我在用户的配置文件视图中遇到了这个默认代码:

<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>

我在哪里可以找到:delete法?我应该如何覆盖默认的designe方法?

推荐答案

我可以建议您在用户模型上重写destroy方法,只需执行update_attribute(:deleted_at, Time.current)(而不是实际销毁),但这种与标准API的偏差可能会在将来成为负担,因此下面是如何修改控制器.

Deviate有一系列现成的默认控制器.定制它们的最佳方法是创建自己的控制器,继承相应的Desive控制器.在本例中,我们讨论的是Devise::RegistrationsController,这很容易通过查看源代码来识别.所以创建一个新的控制器.

class RegistrationsController < Devise::RegistrationsController
end

现在我们有了自己的控制器,完全继承了Desive提供的所有逻辑.下一步是告诉Desive使用它,而不是默认的.在你的路由上有devise_for条线.应将其更改为包含注册控制器.

devise_for :users, :controllers => { :registrations => 'registrations' } 

这似乎很奇怪,但它是有意义的,因为默认情况下它是"设计/注册",而不是简单的"注册".

下一步是覆盖注册控制器中的destroy操作.当你使用registration_path(:user), :method => :delete时,这就是它链接的地方.到destroy注册控制器的操作.

目前Desive做了以下工作.

def destroy
  resource.destroy
  set_flash_message :notice, :destroyed
  sign_out_and_redirect(self.resource)
end

我们可以使用这个代码.首先,让我们为User模型添加新方法.

class User < ActiveRecord::Base
  def soft_delete
    # assuming you have deleted_at column added already
    update_attribute(:deleted_at, Time.current)
  end
end

# Use this for Devise 2.1.0 and newer versions
class RegistrationsController < Devise::RegistrationsController

  def destroy
    resource.soft_delete
    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

# Use this for older Devise versions
class RegistrationsController < Devise::RegistrationsController
  def destroy
    resource.soft_delete
    set_flash_message :notice, :destroyed
    sign_out_and_redirect(resource)
  end
end

现在你应该准备好了.使用作用域筛选已删除的用户.

Ruby-on-rails相关问答推荐

Rails 7.1解决冲突的Zeitwerk Inflection规则

如何控制或定制S为模型使用的命名路由Rail()?

Rails + Turbo_stream自定义操作:我可以在没有Stimulus的情况下根据DOM状态做出有条件的响应吗?

为什么在使用 Ruby on Rails 时我的徽标没有出现在 Bootstrap 导航栏中?

Rails 'includes' 和 'where' 与 belongs_to 和 has_many 关联

未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)

I18n 用于特定于模型的 Rails 提交按钮

Rails - 设计 - 登录时出现错误消息?

使用 javascript 提交 Rails 远程表单

设计和强大的参数

form_tag 是否与 Simple_form 一起使用?

如何编写 Capybara 断言来判断按钮的存在及其启用或禁用状态?

如何在 Rails 迁移中添加一些插入?

Ruby中的参数化获取请求?

禁用 JS/Ajax 请求时的 ActionController::InvalidAuthenticityToken

ruby/ruby on rails 内存泄漏检测

如何一次显示一条 Ruby on Rails 表单验证错误消息?

Date.current 和 Date.today 有什么区别?

在 Ruby on Rails 中设置日志(log)记录级别

如何获取 Rails 3.1 中assets资源 的绝对 URL?