我正在使用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
并弄乱路线,但没有取得任何成功。
提前感谢您的任何帮助!
答案 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?)