1

如果用户没有使用 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 方法,因为它在代码中的许多其他地方都使用过。

4

4 回答 4

1

例如,当您在 ActiveRecord 数据库上定义布尔列时:pro,您将免费获得pro?方法。当你用pro?这种方式覆盖时,它会提高stack level too deep. 因此,请考虑重命名您的方法,例如:

def toggle_pro?
  toggle!(:pro) if provider.blank? 
end
于 2012-08-03T05:50:37.420 回答
1
def toggle_pro
  self.pro = !self.pro if provider.blank?
  self.save!
end
于 2012-08-03T06:11:02.607 回答
1

如果您将pro属性定义为布尔值,则以下方法均可免费使用:

  • pro?pro: 返回属性的布尔值
  • pro=: 设置值pro

一个以 a 结尾的 ruby​​ 方法?应该返回一个布尔值,没有任何副作用。

在你的情况下,我会做的是添加一个回调:

class User

  before_save :check_pro_status

  def check_pro_status
    pro = provider.blank?
  end

end

这将确保每次更改您的user, 在保存之前,它将pro根据提供者正确设置 -status。

希望这可以帮助。

于 2012-08-03T12:07:08.567 回答
0

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

例如:

@user.toggle!(:pro)

如果您的记录是,false那么它将成为true或反之亦然。如果您使用过,则无需对您的对象进行save/update调用toggle!

Note: The method skips validations and callbacks. Attribute must be passed as a symbol.

于 2016-07-15T09:21:52.073 回答