使用simple_form验证:验证对象在点击创建后丢失

时间:2013-05-27 09:59:08

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

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

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

问题: 在验证失败并且新表单的第二次呈现之后,语言选择会引发错误(这在此处发布会非常误导)。问题是创建操作需要经过验证的对象,我们的语言选择不会再次传递给当前网址。

你会如何解决这个问题?

我们可以尝试教我们的语言切换器关于“创建”并让它发送另一个使用相同参数的帖子请求,但这看起来很糟糕。在我们的小助手中必须有很多逻辑,我们在哪里存储对象(至少有一种不是持久存在的)? 有人提到(ab-)使用flash消息来重新创建对象,但它是一个包含多达50个验证的巨大形式,我觉得这个大小更加丑陋。 在这些情况下将对象存储在会话中并让对象再次发布对象(如果存在)可能有效。我最喜欢这一个,但它的感觉还远远不够。

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

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

你有什么意见,其他建议吗?我会非常感激。

谢谢, 安迪

1 个答案:

答案 0 :(得分:0)

因此,我们更改了语言助手,以便再次发送相同的帖子请求,如果它在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请求,因为我们在应用程序中没有任何可选择语言的编辑/更新功能。

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

干杯,
安迪