【问题标题】:Validations using simple_form: validated object lost after hitting create使用 simple_form 进行验证:点击创建后已验证的对象丢失
【发布时间】:2013-05-27 09:59:08
【问题描述】:

我们有一个由多个控制器的 new 操作创建的表单,我们通过 create 操作中的render :new 重复使用它来显示验证错误消息。我相信这是 simple_form 和验证的方法。纠正我,如果我在这里错了。

我们还有一个通用的语言切换机制,它重定向到 current_url,具有不同的语言环境。

问题: 在验证失败和新表单的第二次呈现后,语言选择会引发错误(在此处发布会非常误导)。问题是 create 操作需要经过验证的对象,我们的语言选择不会再次将其传递到当前 url。

你会如何解决这个问题?

我们可以尝试教我们的语言切换器“创建”并让它发送另一个具有相同参数的帖子请求,但这看起来很糟糕。我们的小助手中必须有很多逻辑,我们将在哪里存储对象(至少其中一种根本不持久)? 有人提到(ab-)使用 Flash 消息重新创建对象,但它是一个巨大的表单,最多有 50 个验证,而且我猜这个尺寸更难看。 在这些情况下将对象存储在会话中并让助手再次发布对象(如果存在)可能会起作用。我最喜欢这个,但感觉也很差。

我们可以尝试让 simple_form 使用“new”动作而不是仅仅渲染“new”,但这看起来真的很糟糕。

我们可以完全禁用 create 操作的语言切换,并发出警告说这一步必须以所选语言完成。

您有什么意见或其他建议吗?我将不胜感激。

谢谢, 安迪

【问题讨论】:

    标签: ruby-on-rails-3 internationalization validation simple-form


    【解决方案1】:

    所以我们更改了语言助手以再次发送相同的帖子请求,如果它位于由 POST 创建的页面上。它最终看起来像这样。添加的代码不多:

    def language_link(language)
      url_options = { locale: language }
      if request.request_method == 'POST'
        link_to(language, url_for(params.merge(url_options)), method: :post)
      else
        link_to(language, url_for(url_options))
      end
    end
    

    我们仔细确保不会再次发送有效数据。例如,在这里创建第二笔付款或第二笔订单会很糟糕。我们将来也需要记住这一点,当我们创建新的发布路线时,可以在我们的应用程序的语言可更改的部分访问。这是这里的主要问题。

    它现在不考虑 PUT 请求,因为我们在可选择语言的应用部分没有任何编辑/更新功能。

    我们可以在我们的代码中使用这个版本。所以我发布这个作为答案。但我仍然很高兴看到更好(不那么危险)的版本,以及我们对此的任何想法。

    干杯,
    安迪

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 2012-07-01
      • 1970-01-01
      • 2011-08-12
      • 2020-01-31
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多