1

目前,我让 ActionMailer 在用户注册时发送电子邮件,并与用户生成一个随机 :sign_in_token 。

我还创建了一个名为 active 的方法,用于在用户单击电子邮件中的链接时将 :registration_complete 布尔值切换为 TRUE。

如何设置 url 以便用户可以单击链接并使用我的 active 方法来更改用户值?

目前,我可以发送链接并生成一个随机令牌,但我不知道如何让链接调用我的活动方法。

楷模

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :sign_in_token, 
              :registration_complete

  ###This generates my sign_in_token
  def generate_sign_in_token
    self.sign_in_token = Digest::SHA1.hexdigest([Time.now, rand].join)
  end

end

控制器

def create
  @user = RegularUser.new(params[:regular_user])
  if @user.save      

    ###Sends the User an email with sign_in_token
    UserMailer.registration_confirmation(@user, login_url+"/#{@user.sign_in_token}").deliver

    flash[:success] = "Please Check Your Email to Verify your Registration!"
    redirect_to (verifyemail_path)
  else
    render 'new'
  end
end

###method that finds the user and sets the boolean value to true.
def activate
  @user = User.find_by_sign_in_token!(params[:sign_in_token])    
  if @user.update_attribute(registration_complete: true)
    redirect_to login_url
    flash[:success] = "Email has been Verified."
  end 
end

USER_MAILER

def registration_confirmation(user, login_url)
  @login_url = login_url
  @user = user
  mail(:to => "#{user.name} <#{user.email}>", :subject => "Welcome to APP")
end

意见

###Redirects User to Login Page, But how do i connect it to my activate method or user?
<%= link_to "Complete Registration", @login_url %>

路线

match '/login/:sign_in_token', :to => 'sessions#new'
4

1 回答 1

2

最简单的解决方案是简单地让路由通过 post 将它们直接发送到激活操作。我可能会设置一条完全不同的路线,例如:

match '/activate/:sign_in_token', :to => 'sessions#activate', via: [:post]

然后用 /activate 而不是 /login 向用户发送链接。

编辑:顺便说一句,在您的激活方法中,您必须添加一些额外的逻辑来处理已经激活和无效的 URL 情况。

于 2014-02-02T08:33:46.807 回答