Gemfile:
gem 'devise', '>= 2.0.0'
gem 'devise_invitable', '~> 1.3.4'
访问/invitation/accept.XX?invitation_token=XXXXXXXX
的用户使用以下表单成功设置了密码:
<%= form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => { :method => :put } do |f| %>
<%= devise_error_messages! %>
<%= f.hidden_field :invitation_token %>
<p><%= f.label :password %><br />
<%= f.password_field :password %></p>
<p><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></p>
<p><%= f.submit t("devise.invitations.edit.submit_button"), class:'btn btn-inverse' %></p>
<% end %>
成功后,他们会获得signed_in并重定向到目标网页,但是他们会收到位于以下位置的Flash消息:
en: devise: invitations: invitation_token_invalid: 'The invitation token provided is not valid!'
知道为什么会这样吗?
答案 0 :(得分:1)
我遇到了同样的问题,不确定问题的原因。我在登录后修改了设计重定向,这导致我的应用程序尝试第二次接受邀请。这会导致错误:&#39;提供的邀请令牌无效!&#39;因为DeviseInvitable会在用户第一次成功接受邀请后删除invitation_token。
我的问题代码是:
def after_sign_in_path_for(resource_or_scoped)
session[:previous_url] || root_path
end
答案 1 :(得分:1)
@Steve是正确的,因为该行也是导致此错误的原因。特别是它的session[:previous_url]
。
以下是我的解决方法,为我解决了这个问题。
<强>的routes.rb 强>
devise_for :users, controllers: { invitations: 'users/invitations' }
用户:: InvitationsController 强>
module Users
class InvitationsController < Devise::InvitationsController
def after_accept_path_for(resource)
root_path # you can define this yourself. Just don't use session[:previous_url]
end
end
end
基本上,默认行为是在资源接受邀请后使用after_sign_in_path_for
作为路径。上述解决方案只是覆盖了默认行为。您可以查看docs以获取更多信息。