0

我有一个使用 Devise 的 Rails 3.2.x 应用程序。

根据标准的设计功能,用户可以删除他的帐户(有一个按钮可以点击更改密码屏幕)。

如果用户之前在系统中进行过交易,我想防止用户删除他的帐户。

所以我在用户模型中做了以下

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

它有效,如果不存在交易,用户将被删除,如果交易存在,用户不会被删除。但是:如果用户没有被删除,屏幕仍然显示删除成功消息而不是错误消息。

4

1 回答 1

2

有这样的定制。我相信您将不得不覆盖设计注册控制器。

好消息是这并不难。您所要做的就是在您的应用程序上生成一个新控制器,该控制器将成为该用户的新注册控制器。例如。

bundle exec rails generate controller users/registrations

它必须从 Devise:RegistrationsController 继承

class Users::RegistrationsController < Devise::RegistrationsController

end

最后你必须在你的 routes.rb 文件中引用这个控制器作为新的注册控制器,就像设计页面说的那样

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

现在您可以为该资源实施自定义规则。IE

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

上面的方法是覆盖 devise 的默认销毁方法,只有在不满足条件时才调用原始方法。

于 2013-04-28T17:06:54.793 回答