0

我有2個模型。 UserWant。 A Userhas_many:Want s。Rails - 在定製驗證過程中'不能使用默認proc轉儲散列'

Want模型除了user_id之外還有一個屬性,那就是name

我在Want模型編寫自定義驗證,以便用戶無法提交到創建2個具有相同名稱的希望:

validate :existing_want 

    private 

    def existing_want 
     return unless errors.blank?  
     errors.add(:existing_want, "you already want that") if user.already_wants? name 
    end 

already_wants?方法是在用戶模式:

def already_wants? want_name 
    does_want_already = false 
    self.wants.each { |w| does_want_already = true if w.name == want_name } 
    does_want_already 
end 

驗證規格在我的模型測試中通過,但我的功能測試失敗,當我嘗試並提交create動作WantsController

def create 
    @want = current_user.wants.build(params[:want]) 
    if @want.save 
     flash[:success] = "success!" 
     redirect_to user_account_path current_user.username 
    else 
     flash[:validation] = @want.errors 
     redirect_to user_account_path current_user.username 
    end 
    end 

的錯誤,我得到:不能使用默認PROC

沒有堆棧跟蹤,導致我的代碼傾倒哈希值。

我已經縮小的問題降到這一行:

self.wants.each { |w| does_want_already = true if w.name == want_name } 

,如果我只是返回true不管錯誤顯示在我看來,我想。

我不明白?怎麼了?爲什麼它如此神祕?

謝謝。

+1

是什麼一味以一個ActiveRecord對象? http://stackoverflow.com/q/6391855/479863 –

回答

3

沒有一個堆棧跟蹤(它導致的任何地方,或者它只是沒有出現?),它是很難知道到底發生了什麼,但在這裏是如何在一個乾淨的環境重現此錯誤:

# initialize a new hash using a block, so it has a default proc 
h = Hash.new {|h,k| h[k] = k } 

# attempt to serialize it: 
Marshal.dump(h) 
#=> TypeError: can't dump hash with default proc 

Ruby不能序列化procs,所以它將無法正確重構那個序列化的散列,因此錯誤。

如果您合理地確定該行是您遇到的問題的根源,請嘗試對其進行重構,以查看是否可以解決問題。

def already_wants? want_name 
    wants.any? {|want| want_name == want.name } 
end 

def already_wants? want_name 
    wants.where(name: want_name).count > 0 
end 
+0

啊哈,你的回答讓我看看這行:flash [:validation] = @ want.errors,這似乎也是一個罪魁禍首。謝謝。我明天就解決問題,並在我解決問題時標記正確。 –

+0

感謝您的重構,我是Ruby的noob –