关于验证消息的工厂方法的语义

时间:2013-03-14 09:54:47

标签: ruby activerecord

假设我有一个用户模型,我想用类方法生成一个用户。

我以前做过这样的事情:

def self.generate_user(params)
  user = user.new
  # Some work on the user model
  user.save ? user : nil
end

有了这个,我可以很容易地知道用户是否被创建,但是,我无法访问它的错误消息。

所以我正在考虑这两个选项:

选项1,返回状态和模型

def self.generate_user(params)
  user = user.new
  # Some work on the user model
  return user.save, user
end

然后我必须以这种方式得到结果:ret, user = User.generate_user(params)

选项2,仅返回用户,请使用valid?

进行检查
def self.generate_user(params)
  user = user.new
  # Some work on the user model
  user
end

然后:

user = User.generate_user(params)
if user.valid?
  # Do stuff
end

您更喜欢哪种选择?你有其他的吗?也许使用例外?

2 个答案:

答案 0 :(得分:1)

例外,绝对。如果你使用create!并且它失败了,那么更像Ruby和ActiveRecord会引发异常:

def self.generate_user(params)
  User.create! do |u|
    # Do some stuf wth user
  end
end

begin
  user = User.generate_user(params)
rescue ActiveRecord::RecordInvalid => e
  # Find errors here : e.record.errors
  # Something on rescue
end

答案 1 :(得分:0)

我会尝试:

def self.generate_user(params)
  user = User.create do |u|
    # Do some stuff with user
  end
  user
end

然后:

user = User.generate_user(params)
if user.valid? # or user.persisted?
  # alright
end