1

ユーザーが twitter または facebook でサインアップしていない場合、プロバイダー属性は空白であり、ユーザーはプロ ユーザーです。pro 属性をブール値としてデータベースに追加しました。デフォルトは false です。

以下のコードを使用して、データベースの pro 属性を true に切り替えようとしています。

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

ただし、このエラーが発生します。

stack level too deep

デフプロもやってみた?:pro => provider.blank の場合は true? 終了しますが、次のエラーが発生します。

 syntax error, unexpected tASSOC, expecting keyword_end

コード内の他の多くの場所で使用されているため、pro メソッドも使用する必要があることに注意してください。

4

4 に答える 4

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 に答える
1

:proたとえば、ActiveRecord データベースで boolean 列を定義するとpro?、無料でメソッドを取得できます。pro?このように上書きすると が発生しstack level too deepます。したがって、メソッドの名前を変更することを検討してください。たとえば、次のようになります。

def toggle_pro?
  toggle!(:pro) if provider.blank? 
end
于 2012-08-03T05:50:37.420 に答える
0

ActiveRecord#toggleメソッドを使用してブール値フィールドを簡単に切り替えることができるようになりました

例:

@user.toggle!(:pro)

あなたの記録がそうなら、falseそれはなるtrueか、またはその逆になります。を使用している場合は、オブジェクトを作成save/呼び出す必要はありません。updatetoggle!

注:このメソッドは、検証とコールバックをスキップします。属性はシンボルとして渡す必要があります。

于 2016-07-15T09:21:52.073 に答える