我在我的应用程序中使用了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
答案 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)
无需根据条件的条件有条件或明确设置true
或false
,并且您已经将User
个实例传递给了该块,因此您不会; t需要从数据库加载一个。