当用户多次点击“确认”链接时,设计可确认的行为

时间:2013-12-02 00:34:48

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

我正在使用Devise确认。我遇到了一个问题,即如果用户多次点击确认链接(即如果用户忘记他们已经确认或其他),他们会收到一个令人讨厌的错误:

NoMethodError at /confirmation
undefined method `new_user_registration_path' for  <ActionDispatch::Routing::RoutesProxy:0x007fe739a40510>

这是确认链接:

<%= link_to 'Confirm my account', confirmation_url(@user, host: @host, confirmation_token: @user.confirmation_token) %>

理想的行为会闪现[:alert] =“你已经确认了”+重定向登录页面。

我尝试创建自己的confirmations_controller.rb并弄乱路线,但没有取得任何成功。

提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:2)

在SO上找到一个几乎完全相同的问题后,我自己解决了这个问题:How redirect 'Confirmation token invalid' on Devise

confirmations_controller.rb从设计批发复制到我的应用中不起作用,但为super等人调用create。然后指定新的show操作。

class ConfirmationsController  < Devise::ConfirmationsController

  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to
            after_confirmation_path_for(resource_name, resource) }
    else
      flash[:notice] = "Your account is already confirmed. Please login."
      redirect_to '/login'
    end
  end

end

答案 1 :(得分:1)

默认情况下,Devise将用户重复到达确认页面(具有相同的confirmation_token)作为错误条件。我认为避免消息的最简单方法是覆盖Devise :: Models :: Confirmable中的pending_any_confirmation方法。从该方法中删除将其标记为错误条件的行应该可以解决问题。

假设您有一个用户模型,请在app/models/user.rb文件中插入:

private

def pending_any_confirmation
  if (!confirmed? || pending_reconfirmation?)
    yield
# else
#   self.errors.add(:email, :already_confirmed)
#   false
end

注意:我正在显示注释行,以便您可以看到Devise原始方法的具体内容是如何更改的。您的方法可能只有一行:yield if (!confirmed? || pending_reconfirmation?)