如何创建只能通过随机生成的URL访问的视图?

时间:2012-09-01 01:54:27

标签: ruby-on-rails url routing registration

我想设置一个注册过程,用户最初从该站点请求更多信息,然后接收包含实际注册页面链接的电子邮件。该链接应该是随机生成的URL,否则应限制对注册页面的访问。换句话说,通过在浏览器中手动键入URL,无法访问注册页面。

对于如何最好地实现这些功能,我将不胜感激。

我是Rails的新手,所以如果这个问题是基本的或已经被覆盖,我会事先道歉。

1 个答案:

答案 0 :(得分:0)

您需要将随机令牌存储在数据库中。由于您要将其发送到电子邮件地址,因此您可能还希望存储该电子邮件,以便在注册时将其添加到用户模型中。以下是您可以做的一些相关部分(尽管您需要填补空白)。

基本上,您需要在控制器中使用RegistrationToken.new(:email => "their email address")生成注册令牌。

该模型实现了随机令牌的生成:

class RegistrationToken < ActiveRecord::Base
  # the secret is just to make the random number generator more secure
  @@secret = 6345
  def initialize
    # info at http://www.ruby-doc.org/core-1.9.3/Random.html
    seed = Random.new().integer(1000000000) + @@secret
    token = Random.new(seed).integer(1000000000);
    # you might want to generate random numbers larger than 1 billion
    # for more security (maybe with 64 bit integers?)
  end
end

以及数据库的迁移:

class CreateRegistrationTokens
  def change
    create_table :products do |t|
      t.string :email
      t.integer :token
      t.timestamps
    end
  end
end

然后您只需要设置控制器并查看。

对于您的注册控制器,您只需要:

class RegistrationsController < ActiveRecord::Base
  def new
    @registration_token = RegistrationToken.find(params[:token]).first
    if @registration_token.nil?
      raise 'Invalid token' # or whatever you want, eg. redirect to a page
    end
    # otherwise render the registration form (can do implicit render)
  end
  def create
    @registration_token = RegistrationToken.find(params[:token]).first
    if @registration_token.nil?
      raise 'Invalid token' # or whatever you want, eg. redirect to a page
    end
    # otherwise create the user, eg.
    User.create(params[:user].merge(:email => @registration_token.email))
    @registration_token.destroy
  end
end

上面的控制器操作基本上确保只有在数据库中找到匹配的令牌才能注册。