【问题标题】:Rails 4 - redirect_to, show error message and preserve parametersRails 4 - redirect_to,显示错误消息并保留参数
【发布时间】:2014-12-07 21:46:22
【问题描述】:

我有一个 Rails 应用程序,Users 可以被邀请加入Teams。我有一个Invitation 对象来确定User 已被邀请加入哪个团队。当用户注册并且存在令牌并发现我将User 添加到Team 时,我使用令牌获得了正确的邀请。网址如下所示:

[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 不显示并且文本字段被清除。

所以,我想知道。有没有一种优雅的方式来做我想做的事?

【问题讨论】:

  • 能否包含注册(新?)操作的所有代码?

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


【解决方案1】:

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

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

【讨论】:

  • 我决定改为使用 Flash 消息发送错误消息。
【解决方案2】:

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

  1. 在注册用户和接受加入团队的邀请之间保持明确的区别。某些收到加入团队邀请的人可能已经拥有用户帐户,而您(可能)不想要求他们创建另一个用户帐户才能接受团队邀请。
  2. 使用 Devise gem 管理用户帐户创建。它提供了创建用户帐户、登录、密码恢复等功能。整体理解有点复杂,但入门并不难。在这里自己动手是浪费大量时间。
  3. 有了以上两个,您想要完成的工作就非常简单了。您通过电子邮件发送给某人以邀请他们加入团队的链接将成为您的InvitationsController 中的accept 操作链接。此操作应使用 Devise 的 authenticate_user! 机制,如果点击链接的用户已经登录,则该机制不会执行任何操作。否则,它将使用户进入一个流程,他们可以登录到现有帐户或创建一个新帐户帐户。无论哪种方式,成功登录/注册后,他们将自动返回到您的InvitationsController,您现在可以在其中完成接受邀请的操作,即将用户分配给团队。

在此方案中,登录/注册作为子例程调用的 Web 版本进行处理 - 这是一个自我封装的过程,完成后,通过执行重定向“返回”到您的预期操作。正如您已经看到的那样,做任何其他事情都会使这两个系统不必要地纠缠在一起——接受邀请的动作必须意识到用户注册错误等。这只是一团糟。让他们分开,你会更快乐。

【讨论】:

  • 感谢您的回答。这不是我真正想要的。我以前一直在使用 Devise,我喜欢它,但我认为在以后的 Rails 版本中身份验证变得更加容易。我有你描述的工作流程,已经注册的用户不必再次注册加入团队等。团队应该能够邀请还不是成员的人。这不是我要寻找的一般流程,而是我如何通过使用重定向和保留 url 参数来发送用户错误。我很确定使用 Devise 也会遇到同样的问题。还是谢谢!
  • 不,如果您使用 Devise,您不会遇到同样的问题,因为 Devise 会按照我描述的方式处理这种情况。但是,如果您打算不使用 Devise,您可以使用 Devise 使用的相同机制:当您的用户点击需要身份验证的端点并且您发现用户未通过身份验证时,将整个请求 url 保存在会议。然后重定向以处理登录/注册,使用标准 Rails 技术显示错误(再次呈现有错误的表单)。成功登录/注册后,重定向到您存储在会话中的 url(然后清除它)。
  • 好的,很有趣。我目前最终要做的就是在闪存消息中发送错误消息。迁移到 Devise 需要在整个应用程序中进行大量工作。但它确实有它的优势,就像你上面的例子一样。
  • 将错误信息放入 flash 消息中也可以——这与在 Rails 中通常的做法不同。因此,例如,您将失去突出显示有错误的字段或在出现错误时维护用户输入到表单中的数据的能力。相反,如果您将目标网址放在会话中,您的表单处理机制将是完全标准的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多