2011-09-06 74 views
6

我有我的模型内的一些标准轨验证:导轨不产生验证失败的消息

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 % 

我也试图打印出@ camera.errors对象,这是什么所示:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}> 

正如你所看到的消息散列是空的。我尝试通过执行以下操作手动设置验证错误消息:

validates_presence_of :name, :message => "No name present" 

但它没有填充消息散列。

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

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版本红宝石1.9.2p290和Rails 3.1.0版本。

任何援助将是伟大的!

感谢

+1

控制器代码在这里可能会有所帮助。 – jdl

+0

谢谢,我添加了控制器更新操作。 – stephenheron

+0

我设法解决了我的问题,但由于我无法回答自己的问题7个小时,我暂时将解决方案放在这里。在控制器我使用: redirect_to的:行动=>:编辑 我应该已经使用: 渲染:行动=>:编辑 通过使用redirect_to的我被击中,然后将其在控制器内的编辑操作从数据库中获取新的相机对象,而不是从更新操作保留相机对象。 – stephenheron

回答

5

我设法让我的问题的底部。在控制器我用:

redirect_to :action => :edit 

我应该一直在使用:

render :action => :edit 

通过使用redirect_to时我打的控制器中,然后从数据库中获取一个新的相机对象中的编辑操作而不是从更新操作中保留当前的相机对象。

2

除非你叫@camera.save@camera.valid?,错误哈希不会与验证错误填充。请检查您的控制器代码。

+0

update_attributes确实运行验证,因为它在更新属性后运行save方法。如果查看update_attribute的来源,您可以看到这一点。 http://apidock.com/rails/ActiveRecord/Base/update_attributes – stephenheron

2

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

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

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

刚抬起头,你会得到一个错误Validation failed (ActiveRecord::RecordInvalid)用空的错误信息(如果没有其他错误),当你有before_validation声明和任何人返回false

注意before_validation回调不能返回falsenil是好的),而这可以通过意外,如发生,如果您分配false在该回调方法里面的最后一行的布尔属性。在你的回调方法中明确地写出return true来完成这个工作(或者如果你的回调是一个块,那么最后真的如此)(如here)。

UPDATE:这将不再是首发的Rails 5.0的问题,因为return false将不再停止回调链(throw :abort现在将停止回调链)。

UPDATE:您也可能会收到ActiveRecord::RecordNotSaved: Failed to save the record如果回调返回false

+0

哇。我从来不会猜到这一点。感谢节省我大概几个小时的检查! –

+1

@劳伦斯吴,是的,花了好几个小时才找到自己的问题。 :-) –