3

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

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

我到底应该如何设置注册?现在,我正在使用带有以下代码的自定义设计注册控制器:

# 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 对象。

我不知道将有效的 :sids 列表存储在其他地方是否更有意义,或者我是否应该完全做其他事情来完成这项工作。

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

4

1 回答 1

2

如果我理解你的问题是正确的:你只想让那些拥有特定令牌的人在网站上注册并填写他们的信息。如果这是您想要做的,那么您可以通过生成一个令牌值(比如 6 个字符:18ui7p)并将它们存储在一个单独的表中来完成此操作,然后如果您想要某人注册,您可以向他们发送一个包含有效令牌的 url 说

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

并且在您的注册控制器中,您覆盖new方法以仅允许具有有效令牌(您之前已在数据库中生成并存储)的用户注册为用户,在create操作中也是如此,也不要忘记删除/使用后标记令牌。

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

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

于 2012-11-25T19:35:50.097 回答