这可能是一个奇怪的问题,但它出现在我最近一直在研究的项目中。
我有一个名为Student的Devise模型,它具有唯一的:sid参数。数据库中的Student表已经填充了Student对象,其中仅设置了sid值。我需要让学生使用他们的:sid注册,设置Student对象的其他属性并进行必要的Devise设置。
我应该如何设置注册?现在,我正在使用带有以下代码的自定义Devise RegistrationController:
# inside controllers/students/registration_controller.rb
def create
if Student.exists?(:sid => params[:student][:sid].to_i)
@student = Student.find_by_sid(params[:student][:sid].to_i)
@student.update_attributes(params[:student])
if @student.save
set_flash_message :notice, :signed_up if is_navigational_format?
sign_in(Student, @student)
else
set_flash_message :notice, :sign_up_failed
redirect_to student_registration_path
end
else
set_flash_message :error, :sid_not_found
redirect_to new_student_registration_path
end
end
此代码仅更新现有的Student对象。
我不知道在其他地方存储有效的sid列表是否更有意义,或者我是否应该完全做其他事情才能使其工作。
编辑: 至于我的主要问题,我想知道这是否是最好的方法,只允许使用任意值选择的现有用户对象池中的注册。
答案 0 :(得分:2)
如果我理解你的问题:你想只启用那些有特定令牌的人在网站上注册并填写他们的信息。如果这是你想要做的,那么你可以通过生成一个令牌值(比如6个字符:18ui7p)并将它们存储在一个单独的表中来实现这一点,然后如果你想要一个注册,你发送一个包含有效令牌的URL
http://example.com/users/sign_up?token=18ui7p
并且在您的注册控制器中,您覆盖new
方法,只允许具有有效令牌的用户(您之前在数据库中生成并存储)注册为用户,{{1} 1}}动作,也不要忘记在使用它之后删除/标记令牌。
这样,如果有人(比如学校管理员)想要在系统中添加新人,他们就可以生成令牌并通过电子邮件将其发送给学生,这意味着您将提供生成令牌并发送令牌的操作到电子邮件,当然只有管理员才能访问。
我刚刚发现了一个名为devise_invitable的宝石,它可以做你想要的,但你可以自己实施解决方案。