使用设计设置 X 天后过期的演示用户

Setting up a demo user that expires after X days with devise

我制作了一个应用程序,用户可以在其中存储特定于其个人使用的数据 case/environment。我目前使用设计 gem 设置我的用户。一个用户有 a enum role: [:owner, :admin, :employee]

现在我想创造一种可能性,让用户可以在 30 天内访问该应用程序(例如演示),其中:

问题

如何最好地设置它(以 Rails 方式)?

虽然我只想在我的模型中添加角色并创建删除逻辑等,但这似乎不是最巧妙的方法。

如果您还没有生成设计会话控制器,那么运行:

rails generate devise:controllers users -c=sessions

然后在您的 config/routes.rb 文件中添加:

devise_for :users, controllers: { sessions: 'users/sessions' }

这会告诉 Devise 使用您刚刚生成的新控制器。然后在你的 User 模型中,添加一个告诉你用户是否过期的方法:

## app/models/user.rb

class User < ApplicationRecord
  ROLES = %i[owner admin employee].freeze
  ...
  ...

  def expired?
    return false if ROLES.include? role
    (Time.now..30.days.ago) === created_at
  end
end

我假设您通过检查他们的角色来检查演示用户,如果他们是 admin owneremployee 他们就不是演示用户。

最后,在您的新会话控制器中,您可以删除所有方法(这将告诉 rails 使用设计标准方法),并插入新的创建方法:

class Users::SessionsController < Devise::SessionsController
  def create
    if resource.expired?
      flash[:error] = "Your account has expired"
      return redirect_to new_user_session_path
    end
    super
  end
end