使用设计设置 X 天后过期的演示用户
Setting up a demo user that expires after X days with devise
我制作了一个应用程序,用户可以在其中存储特定于其个人使用的数据 case/environment。我目前使用设计 gem 设置我的用户。一个用户有 a enum role: [:owner, :admin, :employee]
现在我想创造一种可能性,让用户可以在 30 天内访问该应用程序(例如演示),其中:
- a demo_user 无需应用程序邀请即可直接登录平台 him/her
- demo_user 和所有相关数据将在演示过期后(创建后 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
owner
或 employee
他们就不是演示用户。
最后,在您的新会话控制器中,您可以删除所有方法(这将告诉 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
我制作了一个应用程序,用户可以在其中存储特定于其个人使用的数据 case/environment。我目前使用设计 gem 设置我的用户。一个用户有 a enum role: [:owner, :admin, :employee]
现在我想创造一种可能性,让用户可以在 30 天内访问该应用程序(例如演示),其中:
- a demo_user 无需应用程序邀请即可直接登录平台 him/her
- demo_user 和所有相关数据将在演示过期后(创建后 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
owner
或 employee
他们就不是演示用户。
最后,在您的新会话控制器中,您可以删除所有方法(这将告诉 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