2014-01-28 44 views
0

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 

所以在這個被稱爲私有方法,如果我傳遞的方法作爲消息,我認爲這個方法是用來調用我的函數/方法並獲取返回數據。然而,它似乎沒有在當前對象的範圍內調用,也沒有通過錯誤所屬的對象...

所以,如果我的挖掘是在正確的路徑上,似乎調用一個方法對消息的當前對象,或者調用傳遞對象的靜態方法是不可能的。

回答

2

如果你真的需要這個功能,你可以這樣做。

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validate :unique_name 


    def unique_name 
    original_user = User.where("LOWER(name) = ?", name.downcase) 
    if original_user 
     message = "#{name} is not available " 
     message << ActionController::Base.helpers.link_to("Click Here",user_path(original_user)) 
     message << "to view the current #{name}'s account." 
     errors.add(:name,message) 
    end 
    end 
end 

編輯

有一個Proc對象,而不是

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validates_uniqueness_of :name, message: Proc.new{|error,attributes| User.non_unique(attributes[:value]) } 


    def self.non_unique(name) 
    original_user = User.where("LOWER(name) = ? ", name.downcase) 
    message = "#{name} is not available " 
    message << ActionController::Base.helpers.link_to("Click Here",Rails.application.routes.url_helpers.user_path(original_user)) 
    message << "to view the current #{name}'s account." 
    end 
end 

這些都將增加以下錯誤消息:命名

"Name Bob is not available <a href=\"https://stackoverflow.com/users/10\">Click Here</a>to view the current Bob's account." 
+0

是的,我沒看可能性做我自己獨特的驗證,然後讓我做wh atever我喜歡這個消息。猜猜我希望有更像回調的東西。目前試圖查看是否可以在消息中找到':taken'消息,並在'after_validation'期間替換它,但由於消息散列只是readbale,我必須使用類提供的任何方法。這可能意味着抓取屬性的整個錯誤數組,找到並刪除與「:taken」相匹配的值,然後插入一個新值 – Lee

+0

好吧,它具有相同的確切效果,但我爲Proc對象添加了一個方法,適合你的需求以及更接近你原來的問題 – engineersmnky

+0

哈我想它確實有同樣的效果,因爲它仍然需要查詢原始帳戶。但奇怪的是,對於消息來說,使用回調函數更合適,因爲那是我想要修改的,而不是完全自己處理唯一的約束(而不是它結束了任何不同,所以也許我只是愚蠢)。無論如何,感謝您的幫助!猜猜我會開始搜索並找出兩個參數指定的位置,因爲我無法在rails源中找到任何指示,其中屬性傳遞給回調函數。 – Lee