Ruby on rails Rails-Desive-仅当用户对象已经存在时才允许注册

Ruby on rails Rails-Desive-仅当用户对象已经存在时才允许注册,ruby-on-rails,devise,Ruby On Rails,Devise,这可能是一个奇怪的问题,但最近我在一个项目中提出了这个问题 我有一个叫做Student的Desive模型,它有一个唯一的:sid参数。数据库中的Student表已填充了仅设置了:sid值的Student对象。我需要使学生能够使用他们的:sid注册,设置学生对象的其他属性,并进行任何必要的设计设置 我究竟应该如何设置注册?现在,我正在使用具有以下代码的自定义Desive RegistrationController: # inside controllers/students/registrati

这可能是一个奇怪的问题,但最近我在一个项目中提出了这个问题

我有一个叫做Student的Desive模型,它有一个唯一的:sid参数。数据库中的Student表已填充了仅设置了:sid值的Student对象。我需要使学生能够使用他们的:sid注册,设置学生对象的其他属性,并进行任何必要的设计设置

我究竟应该如何设置注册?现在,我正在使用具有以下代码的自定义Desive 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列表是否更有意义,或者我是否应该完全做其他事情来实现这一点

编辑:
至于我的主要问题,我想知道这是否是只允许从使用任意值选择的现有用户对象池中进行注册的最佳方式

如果我没弄错你的问题:你只想让那些拥有某种代币的人在网站上注册并填写他们的信息。如果这是您想要做的,那么您可以通过生成一个令牌值(例如6个字符:18ui7p)并将其存储在一个单独的表中来完成,然后如果您希望有人注册,您可以向他们发送一个包含有效令牌的url,例如

http://example.com/users/sign_up?token=18ui7p
在您的注册控制器中,您覆盖
new
方法,只允许拥有有效令牌(您以前在db中生成并存储过的令牌)的用户注册为用户,这与
create
操作中相同,也不要忘了在使用令牌后删除/标记该令牌

这样,如果有人(比如学校管理员)想要在系统中添加新的人,他们可以生成一个令牌并通过电子邮件发送给学生,这意味着您将提供一个生成令牌并将其发送到电子邮件的操作,当然这只能由管理员访问


我刚刚找到了一个名为gem的工具,它可以做您想要做的事情,但您可以自己实现解决方案。

听起来您已经通过覆盖Desive controller获得了解决方案?到底是什么不起作用?我的问题是关于安全性的--您如何知道一个学生正在使用正确的sid注册?似乎您只需要通过向已知的电子邮件地址发送代码来自动运行注册。至于您对安全性的担忧,很遗憾,由于时间限制,我现在忽略了这一点。理想情况下,学校管理员会为每个学生添加所有信息,注册步骤也不必要,但我不知道要求管理员甚至只为每个学生设置姓名和sid是否合理(我假设高中的平均入学人数约为800人).至于我的主要问题,我想知道这是否是只允许从使用任意值选择的现有用户对象池中进行注册的最佳方式。我回应了安全问题。似乎最有意义的做法是跳过“注册”并通过管理界面创建所有学生(简单的CSV上传即可)。然后,来到该网站的学生可以请求访问,只需发送一封带有登录链接的电子邮件到他们的注册地址,允许他们登录并更改密码。理想情况下,我会使用@numbers131407的解决方案,但根据Khaled下面的回答,我可能最终会使用令牌,使系统为管理员设置的劳动强度降低一点。谢谢大家的评论,感谢他们,我现在能够为注册创建一个具体的计划。谢谢,考虑到我的限制,这可能是最好的解决方案。奇怪的是,我以前看过Desive_Evidence/tokens,并决定它们出于某种原因(可能是大脑放屁)对我不起作用,但你的解决方案改变了我的想法。