执行了validation,但仅在生产中没有在Rails 3.2.0上使用field_with_errors div包围的字段
我有一个出版物模型,在某些字段上有validation,例如标题。
我删除了我觉得烦人的错误消息,并在输入被field_with_error div包围时设置了一个很好的CSS,这样用户就知道哪些字段没有validation。
问题是当我部署到生产时,仍然执行validation(即,用户被发送回表单),但输入不包含错误div。
我尝试在生产模式下本地运行应用程序,我可以学到的是,当我在config / environments / production.rb文件中将config.cache_classes设置为true时,它开始发生。
此外,当我在控制器中记录@ publication.errors时,会出现错误。
任何的想法 ?
在rails 4.0.1项目中,我添加了一个初始化程序:
config/initializers/field_with_errors.rb
用这些线条
ActionView::Base.class_eval do @@field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}".html_safe } end
在深入研究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| "#{html_tag}".html_safe }
已重置或从未设置。
因此,作为一种解决方法,我发现了推杆
ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}".html_safe }
在任何控制器的顶部解决了这个问题,我想是因为它是在rails加载后解释的。
现在的问题是它是如何第一次没有加载的,而应用程序中的其他一切工作得很好?
在我的情况下它发生是因为一个gem’酪蛋白’没有这个gem它工作正常。 在开发过程中它也在工作,但不是在生产中。
它忽略了我为field_error_proc设置的初始化程序。 这是因为它被gem覆盖了我猜…
例如,请参阅: https : //github.com/russellquinn/casein/blob/master/app/controllers/casein/casein_controller.rb
最后,我将控制器复制到我的项目并删除了这一行:
ActionView::Base.field_error_proc = proc { |input, instance| "#{input}".html_safe }
然后初始化器也在生产中工作正常。