我发现这两种方法都可以用来保存数据。使用一种方法比另一种方法有优势吗?有什么优点/缺点?
第一版:
begin
@user.save!
render json: "User #{@user.email} added", status: :created
rescue StandardError => e
render json: @user.errors.full_messages, status: :unprocessable_entity
end
第二版:
if @user.valid?
@user.save!
render json: "User #{@user.email} added", status: :created
else
render json: @user.errors.full_messages, status: :unprocessable_entity
end
答案 0 :(得分:4)
我会选择第三种方法,因为在保存时,模型会自动验证:
if @user.save
render json: "User #{@user.email} added", status: :created
else
render json: @user.errors.full_messages, status: :unprocessable_entity
end
答案 1 :(得分:2)
归结为性能。你的第一种方法更昂贵,因为必须解开完整的调用堆栈来构造异常细节,你甚至不使用它。
当您捕获异常时,异常具有完整堆栈跟踪,其中确切地发生了错误以及导致该事件的方法调用序列是什么。构建此信息需要Ruby转到先前的方法调用,然后转到上一个到上一个方法调用,依此类推。这是一个相当昂贵的操作,因为你已经在方法中,所以你真的不需要这些信息。
所以,在你的两种方法中,第二种版本更好。然而jvperrin的答案甚至更好。在第二种方法中,您调用@user.isvalid?
,其中包含所有模型验证。当您致电@user.save
时,它会再次运行相同的验证。相反,您可以直接致电@user.save
并查看返回值,一切顺利时为true
,当验证错误时为false
。
希望有所帮助。
答案 2 :(得分:0)
你可以这样使用
if @user.valid?
if @user.save!
render json: "User #{@user.email} added", status: :created
else
render json: @user.errors.full_messages, status: :unprocessable_entity
end
else
##some code
end
因为如果用户无效,则无需输入保存块。
答案 3 :(得分:0)
难道您不能仅将validations添加到您的用户模型中作为第三种更简单的替代方案吗?
类似的东西,
class User < Activerecord::Base
validates :email, presence: true
end