在登录过程中回调以将布尔值更改为true或false

时间:2017-08-02 22:30:45

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我在我的应用程序中使用了devise gem。我应该使用哪种回调来在登录过程中从我的用户模型传递方法?

Warden::Manager.after_set_user ? before_validation? before_save? before_create?

方法详情: 我有一个布尔列:users表中的is_active。 每次用户尝试登录时,braintree代码通过braintree api查找用户是否具有活动订阅或不订阅。如果用户有活动或没有订阅,我试图将is_active列更新为true或false。

我目前正在使用它,但它不起作用:

Warden::Manager.after_set_user :scope => :user do |user, auth, opts|

  customer = Braintree::Customer.find('customer_id')
  customer_card = customer.payment_methods[0].token
  payment_method = Braintree::PaymentMethod.find(customer_card)
  sub = payment_method.subscriptions[0]
  sub.status

if Braintree::Subscription::Status::Active
  obj = User.find_by_id(params[:id])
  obj.is_active = true
  obj.save!

else
  obj = User.find_by_id(params[:id])
  obj.is_active = false
  obj.save!
 end
end

def active_for_authentication?
  super && is_active?
end

def inactive_message
  "User not active, please subscribe!"
end

1 个答案:

答案 0 :(得分:0)

由于Braintree::Subscription::Status::Active仅仅是constant pointing to a string "Active",因此它始终是" truthy"。这意味着if Braintree::Subscription::Status::Active永远都是真的。

你可能想要这样做:

user.update(is_active: sub.status == Braintree::Subscription::Status::Active)

无需根据条件的条件有条件或明确设置truefalse,并且您已经将User个实例传递给了该块,因此您不会; t需要从数据库加载一个。