Ruby on rails 在数据库中切换属性

Ruby on rails 在数据库中切换属性,ruby-on-rails,database,oauth,boolean,Ruby On Rails,Database,Oauth,Boolean,如果用户没有注册twitter或facebook,那么provider属性为空,并且用户是专业用户。我已将pro属性作为布尔值添加到数据库中,默认值为false 我正在尝试使用下面的代码将数据库中的pro属性切换为true def pro? toggle!(:pro) if provider.blank? end 但是我得到了这个错误 stack level too deep 我也试过了 def pro? :pro=>如果provider.blank为真? 结束 但是得到这

如果用户没有注册twitter或facebook,那么provider属性为空,并且用户是专业用户。我已将pro属性作为布尔值添加到数据库中,默认值为false

我正在尝试使用下面的代码将数据库中的pro属性切换为true

  def pro?
    toggle!(:pro) if provider.blank? 
  end
但是我得到了这个错误

stack level too deep
我也试过了 def pro? :pro=>如果provider.blank为真? 结束 但是得到这个错误:

 syntax error, unexpected tASSOC, expecting keyword_end

注:我还需要使用pro方法,因为它在代码中的许多其他地方都使用。

当您在ActiveRecord数据库上定义布尔列时,
:pro
例如,您可以免费获得
pro?
方法。当您以这种方式覆盖
pro?
时,它会将
堆栈级别提升得太深
。因此,考虑重命名您的方法,例如:

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

如果将
pro
属性定义为布尔值,则以下方法均免费提供:

  • pro?
    :返回
    pro
    属性的布尔值
  • pro=
    :设置
    pro
结尾的ruby方法应该返回一个布尔值,没有任何副作用

在您的情况下,我要做的是添加回调:

class User

  before_save :check_pro_status

  def check_pro_status
    pro = provider.blank?
  end

end
这将确保每次在
用户中更改某些内容时,在保存之前,它都会根据提供程序正确设置
pro
-状态


希望这有帮助。

现在您可以使用方法简单地切换布尔字段

例如:

@user.toggle!(:pro)
如果您的记录为
false
,则它将变为
true
,反之亦然。如果使用了
切换,则无需对对象进行
保存
/
更新
调用


注意:该方法跳过验证和回调。属性必须作为符号传递。

没有运气仍然返回false。谢谢丹尼斯!它可能是
provider.blank?
返回false,请先检查它。是的,默认情况下它应该返回false,因为pro列是一个布尔值,数据库中的默认值为false。不确定为什么即使provider属性为空,它也不将值更改为true。我在控制台中检查了这段代码,它可以工作。尝试运行
rails c
并使用
toggle\u pro?
provider.blank?
。可能是因为我在attr\u accessible中有:pro?可能是您在用户类中定义了pro方法吗?另外,我不明白我在这里写的方法会得到什么结果-错?无错误?我没有在数据库中得到任何错误。pro是attr_accessible的一部分,我应该删除它吗?我重复我的问题-您是否检查过您没有像
def pro#某物结束
是否将其设置为def pro?提供者。空白?然后我有你的代码在下面。如果我只是使用你的代码,用户无法访问pro部分,它也需要pro方法。代码的其他部分在太多的地方使用pro方法及其属性,无法更改为toggle_pro
@user.toggle!(:pro)