错误未定义的方法`add_error_on' for ConfirmationsController:Class-rails4-devise

时间:2014-08-07 06:56:48

标签: ruby-on-rails devise devise-confirmable

我正在使用Rails 4并设计3.2。在注册时,通过电子邮件向新注册的用户发送激活/确认链接。我已经从this article in the Devise wiki实现了此功能。

每当我输入相同的密码时,他们都会毫无问题地登录,但是当我在第一次尝试时输入密码错误并且在第二次尝试时输入相同的密码时,它无法正常工作。

这是出现的错误

NoMethodError in ConfirmationsController#update
undefined method `add_error_on' for ConfirmationsController:Class

确认控制器

class ConfirmationsController < Devise::ConfirmationsController

  skip_before_filter :require_no_authentication
  skip_before_filter :authenticate_user!

  # PUT /resource/confirmation
  def update
    with_unconfirmed_confirmable do
      if @confirmable.has_no_password?
        @confirmable.attempt_set_password(params[:user])
        if @confirmable.valid? and @confirmable.password_match?
          do_confirm
        else
          do_show
          @confirmable.errors.clear #so that we wont render :new
        end
      else
        self.class.add_error_on(self, :email, :password_already_set)
      end
    end

    if !@confirmable.errors.empty?
      render 'devise/confirmations/new'
    end
  end

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    with_unconfirmed_confirmable do
      if @confirmable.has_no_password?
        do_show
      else
        do_confirm
      end
    end
    if !@confirmable.errors.empty?
      self.resource = @confirmable
      render 'devise/confirmations/new'
    end
  end

  protected

  def with_unconfirmed_confirmable
    original_token = params[:confirmation_token]
    confirmation_token = Devise.token_generator.digest(User, :confirmation_token, original_token)
    @confirmable = User.find_or_initialize_with_error_by(:confirmation_token, confirmation_token)
    if !@confirmable.new_record?

      @confirmable.only_if_unconfirmed {yield}
    end
  end

  def do_show
    @confirmation_token = params[:confirmation_token]
    @requires_password = true
    self.resource = @confirmable
    render 'devise/confirmations/show'
  end

  def do_confirm
    @confirmable.confirm!
    set_flash_message :notice, :confirmed
    sign_in_and_redirect(resource_name, @confirmable)
   end
 end

请帮忙。谢谢。

1 个答案:

答案 0 :(得分:5)

该Wiki文章中更新操作的错误情况已过期。 Devise中不再有add_error_on方法。相反,您可以使用基本的ActiveRecord错误对象:

@confirmable.errors.add(:email, :password_already_set)

然后,您仍然会遇到问题,因为它需要将@confirmable分配给resource才能使默认视图正常工作(wiki示例会针对所有其他错误呈现执行此操作,不是这一个):

if !@confirmable.errors.empty?
  self.resource = @confirmable
  render 'devise/confirmations/new'
end