3

我发现这两种方法都可以保存数据。使用一种方法比另一种方法有优势吗?有什么优点/缺点?

第一个版本:

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
4

4 回答 4

4

我会选择第三种选择,因为在保存时,模型会自动验证:

if @user.save
  render json: "User #{@user.email} added", status: :created 
else
  render json: @user.errors.full_messages, status: :unprocessable_entity
end
于 2013-09-27T03:19:32.203 回答
2

它归结为性能。您的第一种方法更昂贵,因为必须展开完整的调用堆栈以构造异常详细信息,而您甚至不使用它。

例外是昂贵的

当您捕获异常时,该异常具有完整的堆栈跟踪,错误发生的确切位置以及导致该事件的方法调用序列是什么。构建此信息需要 Ruby 转到上一个方法调用,然后递归到上一个到上一个方法调用,依此类推。这是一个相当昂贵的操作,并且由于您已经在该方法中,因此您并不需要此信息。

不需要验证两次

因此,在您的两种方法中,第二个版本更好。然而 jvperrin 的回答甚至更好。在您的第二种方法中,您调用@user.isvalid?which 贯穿所有模型验证。当您调用时@user.save,它会再次通过相同的验证。相反,您可以直接调用@user.save并查看返回值,这是true一切顺利且false出现验证错误的时间。

希望有帮助。

于 2013-09-27T05:40:23.503 回答
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

因为如果用户无效,则无需输入保存块。

于 2013-09-27T03:36:27.593 回答
0

您不能将验证添加到您的用户模型作为第三种更简单的替代方案吗?

就像是,

class User < Activerecord::Base
  validates :email, presence: true
end
于 2013-09-27T05:56:07.800 回答