2012-08-03 77 views
1

如果用戶未使用Twitter或Facebook註冊,則提供者屬性爲空,且用戶爲專業用戶。我將pro屬性作爲布爾值添加到數據庫,默認值爲false。數據庫中的切換屬性

我想使用下面的代碼將數據庫中的pro屬性切換爲true。

def pro? 
    toggle!(:pro) if provider.blank? 
    end 

但是我得到這個錯誤。

stack level too deep 

我也試過 def pro? :pro => true如果provider.blank? 結束 但得到這個錯誤:

syntax error, unexpected tASSOC, expecting keyword_end 

說明我還需要使用親方法,因爲它是在代碼中的許多其他地方使用。

回答

1

如果您在pro屬性定義爲boolean時,以下方法都是免費提供:

  • pro?:返回布爾值pro屬性
  • pro=:設置值pro

?結尾的紅寶石方法預計會返回一個布爾值,沒有任何副作用。

我會做什麼,你的情況,是增加一個回調:

class User 

    before_save :check_pro_status 

    def check_pro_status 
    pro = provider.blank? 
    end 

end 

這將確保每次的東西在你user改變,在保存之前,它將設置pro -status取決於正確在提供者上。

希望這會有所幫助。

1

當您在ActiveRecord數據庫上定義布爾列時,:pro例如,您可以免費獲得pro?方法。當你用這種方式覆蓋pro?時,它會引起stack level too deep。因此,考慮重命名你的方法,例如:

def toggle_pro? 
    toggle!(:pro) if provider.blank? 
end 
+0

沒有運氣仍然返回false。謝謝丹尼斯! – CrazyCoderMonkey 2012-08-03 06:00:59

+0

它可能是'provider.blank?'返回false,請先檢查它。 – 2012-08-03 06:11:03

+0

默認情況下,它應該返回false,因爲列pro是一個布爾值,其數據庫中的默認值爲false。不知道爲什麼即使提供者屬性爲空,它也不會將值更改爲true。 – CrazyCoderMonkey 2012-08-03 06:17:15

1
def toggle_pro 
    self.pro = !self.pro if provider.blank? 
    self.save! 
end 
+0

難道是你已經在你的用戶類中定義了pro方法嗎? 另外,我不明白你在這裏寫的方法會產生什麼 - false?零?錯誤? – 2012-08-03 06:21:29

+0

我沒有在數據庫中發現任何錯誤。 pro是attr_accessible的一部分,我應該刪除它嗎? – CrazyCoderMonkey 2012-08-03 06:24:09

+0

我在重複我的問題 - 你是否檢查過你沒有重新定義pro方法,如 'def pro; #something; end' – 2012-08-03 06:26:24

0

現在你可以使用ActiveRecord#toggle方法

的如只需切換您的布爾字段:

@user.toggle!(:pro) 

如果你的記錄是false那麼它將成爲true或反之亦然。如果您已使用toggle!,則無需對您的對象調用save/update

注意:該方法跳過驗證和回調。屬性必須作爲符號傳遞。