如果用户未注册twitter或facebook,则提供者属性为空,用户为专业用户。我已将pro属性作为布尔值添加到数据库中,默认值为false。
我正在尝试使用下面的代码将数据库中的pro属性切换为true。
def pro?
toggle!(:pro) if provider.blank?
end
但是我收到了这个错误。
stack level too deep
我也试过了 def pro? :pro =>如果provider.blank,则为true? 结束 但得到这个错误:
syntax error, unexpected tASSOC, expecting keyword_end
注意我还需要使用pro方法,因为它在代码中的许多其他地方使用。
答案 0 :(得分:1)
例如,在ActiveRecord数据库({1}}上定义布尔列时,您可以免费获得:pro
方法。当您以这种方式覆盖pro?
时,它会引发pro?
。因此,请考虑重命名您的方法,例如:
stack level too deep
答案 1 :(得分:1)
def toggle_pro
self.pro = !self.pro if provider.blank?
self.save!
end
答案 2 :(得分:1)
如果您将pro
属性定义为布尔值,则以下方法均可免费使用:
pro?
:返回pro
属性pro=
:设置pro
以?
结尾的ruby方法应该返回一个布尔值,没有任何副作用。
在您的情况下,我会做的是添加一个回调:
class User
before_save :check_pro_status
def check_pro_status
pro = provider.blank?
end
end
这将确保您user
每次更改某些内容时,在保存之前,它会根据提供商正确设置pro
- 状态。
希望这有帮助。
答案 3 :(得分:0)
现在您只需使用 ActiveRecord#toggle 方法切换布尔字段
例如:
@user.toggle!(:pro)
如果您的记录为false
,那么它将变为true
,反之亦然。如果您使用save
,则无需对您的对象进行update
/ toggle!
调用。
注意:该方法会跳过验证和回调。属性必须作为符号传递。