2012-07-12 76 views
0

首先,一些背景:如何獲取深層嵌套的錯誤以獲取我的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方法的參數與模型屬性不太相似時,這會變得更加混亂。

那麼解決這個問題的首選方法是什麼?這種方法有什麼基本錯誤嗎?如果是這樣,那麼首選方法是什麼?

回答

0

我想這是最好的避免這種嵌套和堅持較淺的API。

1

關於覆蓋默認軌驗證錯誤信息,你需要寫您的驗證約束這樣的:

validates_presence_of :name, :message => "must be a valid name"