2012-11-25 24 views
3

这可能是一个奇怪的问题,但它出现在我最近一直在研究的项目中。Rails - Devise - 只有在用户对象已经存在的情况下才允许注册

我有一个叫做Student的Devise模型,带有一个独特的:sid参数。数据库中的Student表已经用Student对象填充,只有:设置了sid值。我需要让学生使用他们的:sid进行注册,设置Student对象的其他属性并进行必要的任何设计设置。

我应该如何设置注册?现在,我使用的是自定义的设计与这个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列表是否更有意义,或者如果我应该完全做其他事情来完成此项工作。

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

+3

这听起来像你已经有覆盖设计控制器的解决方案?究竟是不是用这个工作?我的问题是关于安全问题 - 你如何向正确的sid注册?看起来你只需要通过向已知电子邮件地址发送代码来自动运行注册。 – vpsz

+0

至于您关注有关安全,可悲的是我忽视了在这一点上,由于时间的限制。理想的情况是,学校的管理者将增加为每个学生和注册步骤就没有必要所有的信息,但我不知道这是否是合理的,要求管理员为每个学生设定甚至只是名称和SID(我假设高中的平均入学人数为800人左右)。 – Drew

+0

至于我的主要问题,我不知道这是否是去只允许注册从正在使用的任意值选择的现有用户对象池的最佳方式。 – Drew

回答

2

如果我理解你的问题的权利:你想只启用那些具有特定令牌的人在网站上注册并填写他们的信息。如果这是你想要做的,那么你可以通过生成一个令牌值(比如6个字符:18ui7p)并将它们存储在一个单独的表中,然后如果你想要某个人注册,可以通过发送一个包含有效令牌的URL

http://example.com/users/sign_up?token=18ui7p 

,并在您注册控制器,你重写new方法只允许有一个有效的令牌(你已经产生,并在数据库之前存储),注册为用户的用户,在create动作相同,使用后也不要忘记删除/标记令牌。如果

这样的人(说学校管理员)要添加一个新的系统,就可以生成一个标记,并将其发送到学生的电子邮件,这意味着你将提供生成令牌的动作,并发送它发送给一封电子邮件,当然这只能由管理员访问。

我刚刚发现了一个名为devise_invitable这可以做你想做的宝石,但你可能只是自己实现的解决方案。

+0

谢谢,这可能是我的限制条件下最好的解决方案。 奇怪的是,我之前曾经看过devise_inevitable/token,并且因为某种原因决定他们不适合我(脑屁可能),但是您的解决方案已经改变了我的想法。 – Drew

相关问题