P.S:我一直在使用Ruby不到48小時,所以期待我是愚蠢的!驗證消息幫助程序或檢索驗證錯誤
我已經建立了驗證模型,所有工作正常。不過,我想修改由唯一性約束返回的消息。該消息需要通過執行一些額外處理的方法返回。
因此,例如,如果我嘗試創建「名稱」屬性設置爲「bob」,並且bob命名帳戶已存在的新用戶模型,我想顯示一條消息,如「Bob不可用,點擊這裏查看當前鮑勃的賬戶「。
因此,輔助方法將查找當前的bob帳戶,獲取本地化的字符串,並執行本地化字符串的常見字符串放置,將名稱,鏈接到帳戶以及我想要的任何其他信息放入郵件中。
從本質上講,我想是這樣的:
validates_uniqueness_of :text, :message => self.uniquefound()
def uniquefound()
return "some string i can make up myself with #{self.name}'s info in it"
end
毫無疑問,這是完全錯誤的......
如果這是不可能的,我已經找到了我可以使用users.errors.added?
如果name屬性檢測有一個獨特的錯誤添加,從那裏我可以做一些散列操作來刪除唯一的錯誤,並把我自己在那裏要麼在「after_validation」回調或在控制器...還沒有制定出如何做那是,但這是我的後備計劃。
那麼,有沒有爲消息提供類方法回調的方法,或者將當前模型傳遞給該方法(如果它是一個靜態方法),或者在該方法內調用它以使該方法成爲待驗證的模型。
更新
通過軌道源代碼拖網,我發現增加錯誤的錯誤類
private
def normalize_message(attribute, message, options)
case message
when Symbol
generate_message(attribute, message, options.except(*CALLBACKS_OPTIONS))
when Proc
message.call
else
message
end
end
end
所以在這個被稱爲私有方法,如果我傳遞的方法作爲消息,我認爲這個方法是用來調用我的函數/方法並獲取返回數據。然而,它似乎沒有在當前對象的範圍內調用,也沒有通過錯誤所屬的對象...
所以,如果我的挖掘是在正確的路徑上,似乎調用一個方法對消息的當前對象,或者調用傳遞對象的靜態方法是不可能的。
是的,我沒看可能性做我自己獨特的驗證,然後讓我做wh atever我喜歡這個消息。猜猜我希望有更像回調的東西。目前試圖查看是否可以在消息中找到':taken'消息,並在'after_validation'期間替換它,但由於消息散列只是readbale,我必須使用類提供的任何方法。這可能意味着抓取屬性的整個錯誤數組,找到並刪除與「:taken」相匹配的值,然後插入一個新值 – Lee
好吧,它具有相同的確切效果,但我爲Proc對象添加了一個方法,適合你的需求以及更接近你原來的問題 – engineersmnky
哈我想它確實有同樣的效果,因爲它仍然需要查詢原始帳戶。但奇怪的是,對於消息來說,使用回調函數更合適,因爲那是我想要修改的,而不是完全自己處理唯一的約束(而不是它結束了任何不同,所以也許我只是愚蠢)。無論如何,感謝您的幫助!猜猜我會開始搜索並找出兩個參數指定的位置,因爲我無法在rails源中找到任何指示,其中屬性傳遞給回調函數。 – Lee