如何在Devise上重定向'确认令牌无效'

时间:2013-08-15 21:05:13

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

我使用设计配置了我的Rails应用程序:确认并在注册后,用户收到带有确认链接的电子邮件。当用户第二次单击此链接时,令牌无效,这是我的应用程序中的预期行为。但是,它会将用户发送到位于“app \ views \ devise \ confirmations \ new.html.erb”的页面,并显示错误“确认令牌无效”,我想要的是显示该错误(<%= devise_error_messages !%>),但是在我的登录页面中。 (实际上,有两种可能的状态:a)令牌已过期且用户未被确认,因此用户必须再次请求令牌; b)令牌已过期且用户已确认,因此用户必须登录)

为此,我继承了Devise :: ConfirmationsController创建我自己的ConfirmationsController以覆盖show方法,因此如果有任何错误,我可以重定向到登录页面:

class ConfirmationsController  < Devise::ConfirmationsController

  def after_confirmation_path_for(resource_name, resource)
    super
  end

  def new
    super
  end

  def after_resending_confirmation_instructions_path_for(resource_name)
    super
  end

  def create
    super
  end

  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
        respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render 'devise/sessions/new'  }
    end
  end

end

在我的routes.rb中我有这样的配置:

get "confirmations/show"

devise_for :users, :path => '', :path_names => {:sign_in => 'login', :sign_out => 'logout'}, :controllers => {:confirmations => 'confirmations'}
(...)

它正确地重定向到登录页面,但我无法将resources.errors中出现的错误传递到登录页面无关紧要 hard < / strong>我试试。我该如何解决这个问题?

顺便说一下,我的用户模型是这样配置的:

devise :database_authenticatable, :registerable, :confirmable,
    :recoverable, :rememberable, :trackable, :validatable

1 个答案:

答案 0 :(得分:2)

您唯一需要做的就是更改confirmation_instructions.html.erb

只需替换此行

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token =>  @resource.confirmation_token) %></p>

用这个

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>

就是这样。