Thoughtbot folks have a great article on not expecting exceptions – save bang your head, active record will drive you mad. I’ll admit, just like the poster, I used to use save! in controllers to DRY my code. And have a global rescue_from in application.rb. But over the time, I changed the camp and now I’m fully in that “Don’t expect expectations” camp. Some things are more important that DRYing 3 lines of code.
But I’d want to take this a step further. When you’re not expecting something to fail, always use the methods that raise exceptions on failure.
So I strongly disagree with the poster on this :
I think ActiveRecord::Base#save! and ActiveRecord::Base.update_attributes! should be pulled from the public API
I would advocate just the opposite for certain cases. In many of the code reviews we’ve done via ActionRails, the following pattern was seen in many of the models :
def do_something
self.foo = 'bar'
save
end
def create_items
names.each {|n| self.items.create :name => n }
end
In the snippets above, it’s not checking for cases where the save fails. And for good reasons that they’re not likely to fail as code is changing some very minor. But in these scenarios, a failure would be an unexpected situation. Hence you should always use save! or create!.
There could be easily be any unexpected reasons the above save could fail. And using save! protects you from those situations and help catch those minor programming mistakes early, which otherwise could prove to be very costly in terms of time/efforts. So the above code should really be :
def do_something
self.foo = 'bar'
save!
end
def create_items
names.each {|n| self.items.create! :name => n }
end
However, if you’re using exceptions for flow control, this practise won’t always help you :
def create
@user = User.create! params[:user]
redirect_to @user
rescue ActiveRecord::RecordNotSaved
flash[:notice] = 'Unable to create user'
render :new
end
As this catches the exception ActiveRecord::RecordNotSaved, unexpected save! failures from your model methods/callbacks will get caught too. And hide the real error.
Moral of the story :
1,Don’t expect exceptions
2,Use methods throwing exceptions when you’re not expecting a failure. For example, everywhere you’re not checking if save or create fails when working with Active Record objects, always use save! and create! instead.
分享到:
相关推荐
Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save Easy Save ...
《PS2 Save Builder 0.8:二扫文件与PS2存档的转换神器》 在电子游戏领域,PlayStation 2(PS2)作为一款经典的家用游戏机,拥有众多忠实玩家。对于这些玩家来说,保存游戏进度是必不可少的,而PS2的游戏存档文件...
例如,保存和加载一个Transform对象,可以分别使用ES3.Save<Transform>("myTransform", this.transform)和ES3.LoadInto<Transform>("myTransform", this.transform)。 在使用EasySave3时,开发者可能需要了解它可以...
《Unity中的EasySave2数据保存插件:全方位解析与应用》 在Unity游戏开发中,数据保存和加载是不可或缺的功能,它确保了玩家的游戏进度得以持久化,为用户提供连续的游戏体验。EasySave2是一款专为Unity设计的数据...
MySerializableObject loadedObject = ESLoad.Load<MySerializableObject>("mySaveFile"); ``` 3. **注意事项** - 在使用Easy Save时,确保所有需要保存的类都实现了`ISaveable`接口,以便插件知道如何处理这些...
PlayerProgress loadedProgress = EasySave.Load<PlayerProgress>("PlayerProgress"); if (loadedProgress != null) { playerProgress = loadedProgress; } ``` 4. **最佳实践** - 为了提高性能和避免数据...
《本地存储:Unity3D中的Easy Save 3插件详解》 在Unity3D游戏开发过程中,数据存储是一项至关重要的任务。本地存储解决方案允许游戏在用户的设备上持久化数据,如用户进度、游戏设置等。Easy Save 3是一款专门为...
《Unity游戏开发中的数据保存与恢复:EasySave3深度解析》 在Unity游戏开发中,数据保存和恢复是不可或缺的功能,特别是在角色扮演游戏、策略游戏或任何有进度和玩家状态的游戏类型中。EasySave系列插件为此提供了...
AutoSave_AutoSave_AutoSave_无标题模型.skp
《Unity EasySave3:全能数据保存插件的深度解析与应用》 Unity,作为全球领先的实时3D创作工具,广泛应用于游戏开发、视觉特效、建筑可视化等领域。在这些项目中,数据保存是不可或缺的一部分,它涉及到游戏进度、...
3. 打开Photoshop,选择“文件”>“脚本”>“浏览”,找到并运行你刚刚添加的“save-ps-to-svg”脚本。 4. 脚本会自动检测当前文档中的所有形状图层,并询问你是否要将它们全部导出为SVG。 5. 确认后,脚本会创建一...
描述中的重复部分"DataSave DataSave DataSave DataSave DataSave DataSave"可能是由于某种原因导致的重复显示,通常这种情况在实际的产品描述中不太可能出现,但我们可以将其理解为强调数据保存的重要性。...
通常,开发者会在Unity编辑器中通过`Assets > Import Package > Custom Package` 菜单来导入这个unitypackage文件。 总结来说,Easysave是Unity3D开发中一个实用的数据管理工具,它的使用能够极大地简化游戏数据的...
在IT领域,"filesave 用于下载"是一个关于文件保存和下载的技术概念,通常与JavaScript中的FileSaver库有关。FileSaver.js是一个轻量级的JavaScript库,它允许用户在浏览器环境中方便地保存文件到本地,而无需依赖...
在MATLAB编程环境中,"AUTOSAVE"是一个重要的功能,它允许用户自动保存工作区中的变量,以防意外关闭或程序崩溃导致数据丢失。这个压缩包包含两个文件:`autosave.m`和`license.txt`。 `autosave.m`是MATLAB的M文件...
【0积分下载】Easy Save:简化游戏数据存储与加载 一、Easy Save 简介 Easy Save 是专门为 Unity 开发者设计的一款数据存储和加载工具。它旨在简化数据保存和恢复的过程,使开发者能够专注于游戏的核心逻辑,而...
这通常涉及将脚本文件放置在Photoshop的Scripts文件夹内,然后通过菜单的“文件”>“脚本”来选择执行。同时,用户需要具备一定的JavaScript基础知识,以便理解脚本的工作原理,或者在出现问题时进行调试。 总的来...
"Easy Save - The Complete Save Load Asset" 是一个专为Unity游戏引擎设计的高效存档加载插件,版本号为3.3.1f9。这个工具包被封装在一个名为"Easy Save - The Complete Save Load Asset - 3.3.1f9.7z"的压缩文件中...
标题中的“Excel、Word转PDF时,异常com.jacob.com.ComFailException: Invoke of: SaveAs”是一个关于在编程环境中转换Microsoft Office文档(如Excel和Word)为PDF格式时遇到的错误。这个错误通常与使用Jacob库进行...
WWW Power Save和Legacy Power Save是两种电源管理技术,主要用于网络设备,如无线路由器、交换机等,以提高能源效率并降低运行成本。这两种技术在现代智能家庭和企业网络环境中尤为重要,因为它们能够帮助用户在...