我的模型中有许多标准的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 %
我还试图打印出@ 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版本ruby 1.9.2p290和Rails版本3.1.0.
任何帮助都会很棒!
谢谢
解决方法
只是提醒一下,当你有before_validation声明并且其中任何一个返回false时,你会得到一个Validation Failed(ActiveRecord :: RecordInvalid)错误,并显示一条空错误消息(如果没有其他错误).
请注意,before_validation回调不能返回false(nil是可以的),这可能是偶然发生的,例如,如果您在该回调方法的最后一行中为布尔属性赋值false.在你的回调方法中明确地写回return以使其工作(或者如果你的回调是一个块(如here所述),则在结尾处为真).
更新:这将不再是启动Rails 5.0的问题,因为return false将不再停止回调链(throw:abort现在将暂停回调链).
更新:您可能还会收到ActiveRecord :: RecordNotSaved:如果回调返回false,则无法保存记录.