执行了验证,但仅在生产中Rails 3.2.0上没有用field_with_errors div包围的字段

时间:2012-06-21 10:22:30

标签: ruby-on-rails ruby-on-rails-3 validation production-environment

我有一个出版物模型,在某些字段上有验证,例如标题。

我删除了我觉得讨厌的错误消息,并在field_with_error div中包含输入时设置了一个很好的CSS,以便用户知道哪些字段没有验证。

当我部署到生产时,仍然执行验证(即,用户被发送回表单),但输入不包含错误div。

我尝试在生产模式下本地运行应用程序,我所能学到的是当我在config / environments / production.rb文件中将config.cache_classes设置为true时,它开始发生。

当我在控制器中记录@ publication.errors时,也会出现错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

在深入研究Rails本身后,我发现在actionpack / lib / action_view / helpers / active_model_helper.rb

Base.field_error_proc.call(html_tag, self)

返回html_tag而不将其包装在错误div中。

进一步说明,在actionpack / lib / action_view / base.rb中,

@@field_error_proc = Proc.new{ |html_tag, instance| "<div class=\"field_with_errors\">#{html_tag}</div>".html_safe }

已重置或从未设置。

因此,作为一种解决方法,我发现了

ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "<div class=\"field_with_errors\">#{html_tag}</div>".html_safe }

在任何控制器的顶部解决了这个问题,我想是因为它是在rails加载后解释的。

现在的问题是它是如何第一次没有加载的,而应用程序中的其他一切工作正常?

答案 1 :(得分:2)

在rails 4.0.1项目中,我添加了一个初始化程序:

config/initializers/field_with_errors.rb

这些行

ActionView::Base.class_eval do
  @@field_error_proc = Proc.new{ |html_tag, instance| "<div class=\"field_with_errors\">#{html_tag}</div>".html_safe }
end

答案 2 :(得分:1)

在我的情况下,它发生了因为宝石'酪蛋白' 没有这个宝石它工作正常。 同样在开发过程中,它正在运行,但尚未投入生产。

忽略了我为field_error_proc设置的初始化程序。这是因为它被宝石覆盖了我猜...

例如,请参阅:https://github.com/russellquinn/casein/blob/master/app/controllers/casein/casein_controller.rb

最后,我将控制器复制到我的项目并删除了这一行:

Nmap scan report for mjsindia.cloudapp.net (13.66.56.229)

PORT     STATE    SERVICE
3389/tcp filtered ms-wbt-server

然后初始化器在生产中也能很好地工作。