Rails - 设计 - 仅在用户对象已存在时才允许注册

时间:2012-11-25 04:43:33

标签: ruby-on-rails devise

这可能是一个奇怪的问题,但它出现在我最近一直在研究的项目中。

我有一个名为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列表是否更有意义,或者我是否应该完全做其他事情才能使其工作。

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

1 个答案:

答案 0 :(得分:2)

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

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

并且在您的注册控制器中,您覆盖new方法,只允许具有有效令牌的用户(您之前在数据库中生成并存储)注册为用户,{{1} 1}}动作,也不要忘记在使用它之后删除/标记令牌。

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

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