1

我们有多个控制器的行动,这是我们在通过render :new重用创建的窗体创建行动来显示验证错误消息。我相信这是进行simple_form和验证的方法。纠正我,如果我在这里错了。验证使用simple_form:击球创建后失去验证对象

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

问题: 验证失败并且新窗体的第二次渲染失败后,语言选择会抛出一个错误(这对于张贴在这里会非常误导)。问题是创建操作需要经过验证的对象,我们的语言选择不会再次传递给当前网址。

你会如何解决这个问题?

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

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

我们可以禁用语言切换创建完全行动,并警告说这一步必须在选定的语言完成。

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

感谢, 安迪

回答

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请求,因为我们没有任何语言可选的应用程序部分的编辑/更新功能。

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

干杯,
Andy