Ruby on rails Rails不生成验证失败消息

Ruby on rails Rails不生成验证失败消息,ruby-on-rails,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3.1,我的模型中有许多标准rails验证: validates_presence_of :url_string validates_uniqueness_of :url_string validates_presence_of :stream_source validates_presence_of :width validates_presence_of :height validates_presence_of :name validates_uniqueness_of :name validat

我的模型中有许多标准rails验证:

validates_presence_of :url_string
validates_uniqueness_of :url_string
validates_presence_of :stream_source
validates_presence_of :width
validates_presence_of :height
validates_presence_of :name
validates_uniqueness_of :name
validates_presence_of :customer_name
validates_presence_of :iframe_background_color
如果我没有在表单中填写其中一个字段,那么我会按照预期返回表单,但奇怪的是没有显示错误消息。我正在使用下面的代码显示错误消息:

<% @camera.errors.full_messages.each do |error| %>
  <p><%= error %></p>
<% end %
但它也没有填充消息散列

控制器更新操作如下所示:

def update
  @camera = Camera.find(params[:id])
  if @camera.update_attributes(params[:camera])
    flash[:notice] = "Camera updated"
    redirect_to nwcadmin_camera_path
  else
    redirect_to :action => :edit
  end 
end 
我使用的是Ruby版本Ruby 1.9.2p290和Rails版本3.1.0

任何帮助都会很好


谢谢

除非您调用
@camera.save
@camera.valid?
,否则错误哈希将不会填充验证错误。请检查您的控制器代码。

您可以在控制器代码中使用flash[:message]或flash[:notice]来存储错误消息,该错误消息可用于显示错误。查看链接,它清楚地解释了如何附加错误消息并使用它们来显示。实例变量不包含任何错误,因为更新中没有运行验证

您可以使用@camera\u errors=@camera.save收集错误,然后

  <% @camera_errors.errors.full_messages.each do |error| %>
   <p><%= error %></p>
  <% end %>


我不确定您是否对此感兴趣,但您可以使用Rails官方gem:
动态表单

此gem为您提供两种帮助方法:
error\u messages
error\u messages\u for


有关更多信息,请参阅以下Rails指南:

我设法找到了问题的根源。在我使用的控制器中:

redirect_to :action => :edit
我应该使用:

render :action => :edit

通过使用redirect_to,我在控制器中点击编辑操作,然后从数据库中获取新的摄影机对象,而不是从更新操作中保留当前摄影机对象

当您在验证之前有
声明,并且其中任何声明返回
false时,您将得到一个
验证失败(ActiveRecord::RecordInvalid)
错误,并显示一条空错误消息(如果没有其他错误)

请注意,
在验证之前
回调不能返回
false
nil
可以),这可能是偶然发生的,例如,如果您将
false
分配给回调方法内最后一行的布尔属性。在回调方法中显式写入return true以使其生效(或者,如果回调是块,则在结尾处仅为true(如上所述))

更新:从Rails 5.0开始,这将不再是一个问题,因为
返回false
将不再停止回调链(
throw:abort
现在将停止回调链)


更新:您可能还会收到
ActiveRecord::RecordNotSaved:保存记录失败
如果回调返回
false

,控制器代码可能会在此处有所帮助。谢谢,我添加了控制器更新操作。我设法找到了问题的根源,但由于我在接下来的7个小时内无法回答自己的问题,我将暂时在这里提出解决方案。在我使用的控制器中:redirect_to:action=>:edit我应该使用:render:action=>:edit By use redirect_to我在控制器中执行编辑操作,然后从数据库中获取新的摄影机对象,而不是从更新操作中保留摄影机对象。可能重复update_attributes会在更新属性后运行save方法时运行验证。如果查看update_属性的源,可以看到这一点。哇!我永远也猜不到这一点。谢谢你帮我省了几个小时的检查时间@LawrenceWu,是的,我自己花了几个小时来发现这个问题。:-)
redirect_to :action => :edit
render :action => :edit