Rails - 这是保存模型更新的更好方法

时间:2013-09-27 03:07:59

标签: ruby-on-rails ruby-on-rails-4

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

第一版:

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 个答案:

答案 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