首先,一些背景:如何獲取深層嵌套的錯誤以獲取我的REST API?
我有一個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
我希望通過返回一個未保存的公司對象,設置錯誤,將是一個很好的方式溝通錯誤(這與當驗證錯誤時導軌工作方式類似)。
問題是,在公司對象上調用valid?
時,它刪除了我在那裏寫的錯誤並添加了常規驗證錯誤(在這種情況下,公司不能爲空)。
和獎金的問題...
而且還有一個概念性的問題還有:因爲我提供的是被用來創建實際的屬性參數創建模型,他們不總是很好地映射到錯誤[:attr]哈希。在這種情況下,它並沒有那麼糟糕,我使用的公司字段爲company name
參數,但是我認爲當提供給create方法的參數與模型屬性不太相似時,這會變得更加混亂。
那麼解決這個問題的首選方法是什麼?這種方法有什麼基本錯誤嗎?如果是這樣,那麼首選方法是什麼?