0

首先,一些背景:

我有一个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 方法的参数与模型属性不太相似时,这会变得更加混乱。

那么解决这个问题的首选方法是什么?这种方法基本上有问题吗?如果是这样,首选方法是什么?

4

2 回答 2

1

关于覆盖默认的 rails 验证错误消息,您需要像这样编写验证约束:

validates_presence_of :name, :message => "must be a valid name"
于 2012-07-12T21:08:45.937 回答
0

我认为最好避免这种嵌套并坚持使用较浅的 API。

于 2012-07-30T16:08:46.843 回答