2017-07-05 71 views
0

我想獲得驗證消息的順序與我們的窗體上的順序相同。我可以在Rails中確定驗證錯誤消息的順序嗎?

我們有三類:

class User 
    accepts_nested_attributes_for :pledges 
end 

class Pledge 
    accepts_nested_attributes_for :companies 
    validates_presence_of :pledgor_surname 
end 

class Company 
    validates_presence_of :name 
end 

在一種形式中,我們可能不得不採取屬性爲所有三個,所以我們得到PARAMS如下所示:

{"pledges_attributes"=> 
    {"0"=> 
    {"pledgor_surname"=>"", 
    "id"=>"230", 
    "companies_attributes"=> 
     {"0"=> 
     {"id"=>"125", 
     "name"=>"" 
     } 
     } 
    } 
    } 
} 

當我打電話@user.update(params),它沒有按照我的預期進行驗證。但errors#full_messages名單如下:

["Company name can't be blank", "Pledgor surname can't be blank"]` 

而且錯誤出現在相同的順序在頁面上。

缺乏對消息對象的黑客攻擊,有沒有辦法告訴Rails爲了放置消息,或至少應該首先發布出錯錯誤和公司錯誤?

+1

的#full_messages接通差錯到一個數組,但在此之前,他們是在哈希狀物體(見'錯誤[]中的部分'[這裏](http://guides.rubyonrails.org/active_record_validations。 HTML#驗證 - 概述 - 錯誤))。因此,您可以使用'errors.values_at(:name,:surname).flatten'來獲取與提供的鍵相同順序的錯誤。 –

+1

請注意,這是真正舊的Rails 3.x風格的驗證。 4+使用導軌'驗證:pledgor_surname,存在:作爲TRUE'每[文檔】(http://guides.rubyonrails.org/active_record_validations.html)。 – tadman

回答

0

不,它們以散列形式返回,哈希不提供可靠的排序。這可以被覆蓋,這通常通過將文件添加到lib文件夾並在rails配置中指定覆蓋來完成。

編輯根據Ruby 1.9.3以下的註釋,哈希值實際上是有序的,所以忽略我所說的。

+2

您可以按特定順序提取散列值。你建議@Arepo是什麼「覆蓋」? –

+0

另外'Hash'可靠有序的,因爲1.9.3 – engineersmnky

+0

不知道,它是有意改組,以防止任何人混淆它被責令感謝您的信息,我剛剛最近一直與圍棋。如果可能,我會更新我的答案或刪除它。 –