首先,一些背景:
我有一个Company
模型,一个Project
模型和一个Task
模型。一个项目属于一个公司,一个任务属于一个项目。
该Project
模型具有几个属性:company_id, date
. 这些属性唯一标识一个项目
我让用户通过发布到包含识别项目所需详细信息的 URL 来通过 API 创建任务。例如:
POST /projects/<comnpany_name>/<date>/tasks/
为了让用户的生活更轻松,如果没有具有给定详细信息的项目,我想通过给定的详细信息动态创建项目,然后创建任务并将其分配给项目。
...我的问题是:
当创建项目出现问题时,假设公司名称无效,返回错误信息并与用户沟通的正确方法是什么?
我将解释我的意思:我添加了一个create_by_name_and_company_name
方法Project
:
def self.create_by_name_and_company_name(name, company_name)
if company = Company.find_by_name(company_name)
project = Project.create(company_id: company.id,
name: name)
else # cannot create this project, trying to communicate the error
project = Project.new(name: name)
project.errors.add(:company, 'must have a valid name')
end
company
end
我希望通过返回一个未保存的 Company 对象并设置错误,这将是一种传达错误的好方法(这类似于出现验证错误时 rails 的工作方式)。
问题是在调用valid?
公司对象时,它删除了我在那里写的错误并添加了常规验证错误(在这种情况下,公司不能为空)。
还有一个额外的问题......
还有一个概念问题:因为我通过提供用于创建实际属性的参数来创建模型,所以它们并不总是很好地映射到 errors[:attr] 哈希。在这种情况下,它并没有那么糟糕,我使用 company 字段作为company name
参数,但我想当提供给 create 方法的参数与模型属性不太相似时,这会变得更加混乱。
那么解决这个问题的首选方法是什么?这种方法基本上有问题吗?如果是这样,首选方法是什么?