我希望在用户注册时发送电子邮件。此电子邮件应包含链接,可将帐户更改为完整用户。我希望此电子邮件链接是安全性的标记。
目前:我收到要发送的电子邮件,但是当我点击该链接时出现此错误。
UsersController#accept_invitation 中的undefined method `email_activation_token=' for nil:NilClass
已发送链接 http://localhost:3000/users/accept_invitation.tLPOjM3hdA13rEv5FNhsOQ
user_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
UserMailer.registration_confirmation(@user).deliver
redirect_to root_url, :notice => "Signed up!"
else
render "new"
end
def accept_invitation
@user = User.find_by_email_token(params[:email_token])
@user.email_activation_token = true
@user.save
redirect_to root_url, :notice => "Email has been verified."
end
end
end
registration_confirmation.html.haml
Confirm your email address please!
= accept_invitation_users_url(@user.email_token)
user.rb模型
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
attr_accessor :password
before_save :encrypt_password
before_save { |user| user.email = email.downcase }
before_create { generate_token(:auth_token) }
before_create { generate_token(:email_token) }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
VALID_PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,}$/
validates_confirmation_of :password
validates :password, :on => :create, presence: true, format: { with: VALID_PASSWORD_REGEX }
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
end
email_activations_controller.rb
class EmailActivationsController < ApplicationController
def edit
@user = User.find_by_email_activation_token!(params[:email_token])
@user.email_activation_token = true
@user.save!
redirect_to root_url, :notice => "Email has been verified."
end
def new
@user = User.find_by_email_activation_token!(params[:email_token])
end
def edit
end
end
答案 0 :(得分:2)
这是一个快速刺刀:
= accept_invitation_users_url(email_token: @user.email_token)
链接http://localhost:3000/users/accept_invitation.tLPOjM3hdA13rEv5FNhsOQ
错误。
它应该看起来像http://localhost:3000/users/accept_invitation?email_token=tLPOjM3hdA13rEv5FNhsOQ
,以便成为params
哈希的一部分。