我有一个Rails应用,Users
可以邀请加入Teams
。我有Invitation
个对象来确定User
被邀请到哪个团队。我通过使用令牌获得了正确的邀请,当用户注册并且存在令牌并且发现我将User
添加到Team
时。 URL如下所示:
[baseurl]/signup/invitation_token?invitation_token=[token]
但是,当用户在注册表单中输入无效或错误信息时,我会遇到一些问题,例如错误的确认密码。在这样的情况下按提交时,我的应用程序默认重定向索引路径。
[baseurl]/users
显示@user.errors
。
这是我使用的时候:
format.html { render action: :new }
在我users controller
的创建操作中。
我想要的仍然是signup path
或重定向回signup path
,仍然具有相同的invitation_token
参数,并显示@user.errors
。最理想的是,我还希望保留文本字段中的值(不太重要)。
我试过:
format.html { redirect_to signup_invitation_path(invitation_token: @invitation.token) }
这适用于保留我的令牌,但我的errors
未显示,文字字段已清除。
所以,我想知道。是否有优雅和有轨道的方式来做我想要的?
答案 0 :(得分:1)
一个选项 - 作为解决方法 - 是在执行重定向之前将错误暂时保留在会话中,如session[:signuperrors] = @user.errors
。然后你只需要检查是否有错误显示。
这有效,但在不了解更多有关注册控制器和路由器的情况下,我无法提供更好的解决方案。
答案 1 :(得分:1)
我之前已经建立了这个确切的流程,所以我有直接的经验和建议。
accept
InvitationsController
行动的链接。此操作应使用Devise的authenticate_user!
机制,如果用户点击链接已经登录,则无法执行任何操作。否则,它会将用户置于可以登录已经登录的流程中。现有帐户或创建新帐户。无论哪种方式,在成功登录/注册后,它们将自动返回到您的InvitationsController
,您现在可以完成接受邀请的操作,即将用户分配给团队。在此方案中,登录/注册作为子程序调用的Web版本处理 - 它是一个自封装的过程,在完成后,"返回"通过执行重定向来实现您的预期操作。正如您已经看到的那样,做其他任何事情都会导致您不必要地纠缠这两个系统 - 接受邀请的行为必须意识到用户注册错误等等。这只是一团糟。保持分开,你会更快乐。