ruby-on-rails - Ruby on Rails - 电子邮件确认链接给出 nomethoderror

标签 ruby-on-rails ruby ruby-on-rails-3 authentication email-validation

我希望在用户注册时发送电子邮件。此电子邮件应包含一个链接将帐户更改为完整用户。我希望此电子邮件链接成为安全 token 。

  • email_token 是每个用户随机生成的 token
  • email_activation_token 是一个 bool 值,表示用户是否完成注册

目前:我收到了要发送的电子邮件,但是当我点击链接时出现此错误。

UsersController 中的 NoMethodError#accept_invitation

undefined method `email_activation_token=' for nil:NilClass

链接已发送 http://localhost:3000/users/accept_invitation.tLPOjM3hdA13rEv5FNhsOQ

用户 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

最佳答案

这是一个快速的尝试:

= 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 散列的一部分。

关于ruby-on-rails - Ruby on Rails - 电子邮件确认链接给出 nomethoderror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311440/

相关文章:

ruby-on-rails - 未初始化的常量 Sass::Rails::SassTemplate

ruby-on-rails - 如何在 heroku Elastic Cloud、Elastic Search 5.x 上进行身份验证?

ruby-on-rails - 当遇到过时警告时,如何配置Rails引发错误?

ruby-on-rails - 如何逐行递增地构建 ActiveRecord 查询?

ruby-on-rails - gon 未在 javascript 中定义错误

ruby-on-rails - 在 Rails ActiveAdmin View 中添加指向 Flash 通知的链接

ruby-on-rails - I18n 不使用公寓 gem rails 加载翻译

javascript - 如何添加/删除参数以与 jquery 链接

javascript - 使用 Selenium 模拟将文件拖到上传元素上

ruby - Ruby Coverage.c 是什么,它有什么用?