Rails 4 - redirect_to,显示错误消息并保留参数

时间:2014-12-07 21:46:23

标签: ruby forms ruby-on-rails-4 rails-routing

我有一个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未显示,文字字段已清除。

所以,我想知道。是否有优雅和有轨道的方式来做我想要的?

2 个答案:

答案 0 :(得分:1)

一个选项 - 作为解决方法 - 是在执行重定向之前将错误暂时保留在会话中,如session[:signuperrors] = @user.errors。然后你只需要检查是否有错误显示。

这有效,但在不了解更多有关注册控制器和路由器的情况下,我无法提供更好的解决方案。

答案 1 :(得分:1)

我之前已经建立了这个确切的流程,所以我有直接的经验和建议。

  1. 在注册用户和接受加入团队的邀请之间保持明确的分离。收到加入团队邀请的某些人可能已拥有用户帐户,而您(可能)并不想要求他们创建其他用户帐户,以便他们接受团队邀请。
  2. 使用Devise gem管理用户帐户创建。它提供了用于创建用户帐户,登录,密码恢复等功能。完整地理解它有点复杂,但开始使用它并不困难。在这里滚动自己是浪费大量时间。
  3. 有了上面的两个,你想要完成的事情是非常直截了当的。您通过电子邮件发送给某人以邀请他们加入团队的链接将成为您accept InvitationsController行动的链接。此操作应使用Devise的authenticate_user!机制,如果用户点击链接已经登录,则无法执行任何操作。否则,它会将用户置于可以登录已经登录的流程中。现有帐户或创建新帐户。无论哪种方式,在成功登录/注册后,它们将自动返回到您的InvitationsController,您现在可以完成接受邀请的操作,即将用户分配给团队。
  4. 在此方案中,登录/注册作为子程序调用的Web版本处理 - 它是一个自封装的过程,在完成后,"返回"通过执行重定向来实现您的预​​期操作。正如您已经看到的那样,做其他任何事情都会导致您不必要地纠缠这两个系统 - 接受邀请的行为必须意识到用户注册错误等等。这只是一团糟。保持分开,你会更快乐。