如何在rails中生成像确认页面这样的临时页面?

时间:2016-06-30 13:16:34

标签: ruby-on-rails ruby devise

我正在使用设计,并希望在注册时将用户重定向到确认页面,这就是我现在正在做的事情:

用户/ registrations_controller.html.erb

class Users::RegistrationsController < Devise::RegistrationsController

 def confirm_email
 end

 private

 def after_inactive_sign_up_path_for(resource)
  users_confirmyouremail_path
 end
end

配置/ routes.rb中

devise_scope :user do     
  get 'users/confirmyouremail' => 'users/registrations#confirm_email' 
end

注册后重定向页面没问题。但是,我认为任何人都可以使用“host.com/confirmyouremail”等网址访问该页面并查看确认页面,这很奇怪。我有什么方法可以编写一条路线,使用只允许一次访问的随机码吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

也许是这样的:

before_action :authenticate_user!

def confirm_mail
    redirect_to root_path if current_user.confirmed
...
end

如果用户已经确认了他的帐户,则存储在数据库中。如果他的帐户被确认,那么他将无法访问此页面。您可以重定向到您想要的任何页面。由于之前的操作

,没有任何帐户的用户将无法访问此页面

如果用户在访问此confirm_mail页面时未登录,则您有不同的可能性。您可以使用会话或cookie:

# after sign up:
session[:confirm] = true
# alternatively a cookie
cookies[:confirm] = true

然后在确认邮件行动中:

def confirm_mail
  if session[:confirm].blank? # or cookies[:confirm].blank?
    redirect_to root_path
  end

  # otherwise delete the field from the session
  session.delete(:confirm)
  # alternatively the cookie
  cookies.delete(:confirm)
end

另一种方法是使用令牌。您创建了一个像ConfirmMailToken这样的新模型。然后在注册时,您创建一个新令牌并将用户重定向到确认页面,并将令牌作为URL参数。然后在confirm_mail操作中检查令牌是否可用并删除它(如果有)。这样,您可以确保仅在重定向后显示该页面。