我使用devise gem进行身份验证,登录或注册后,会创建一个Cookie:
cookies[:email] = {
:value => params[:store][:email],
:domain => :all,
:expires => 1.hour.from_now
}
Cookie的目的是找到current_client
:
def current_client
if cookies["email"].present?
Store.find_by_email(params[:email])
end
end
然后查看商店是否有有效的braintree订阅,
并将stores表下的is_active
布尔值更改为true
或false
。
after_action :active_subscription
def active_subscription
if current_client.present?
customer_id = current_client.braintree_customer_id
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
current_client.update_attributes(is_active: true)
end
end
但上面的active_subscription
方法不会更新is_active
列。关于我可能会在这里犯错的任何想法?
答案 0 :(得分:2)
active_subscription
方法中存在一些问题。
if
检查应将用户的状态与常量进行比较:
# always passes because it's only looking at the constant!
if Braintree::Subscription::Status::Active
# instead, compare the client's status to the constant
if sub.status == Braintree::Subscription::Status::Active
由于验证错误,update_attributes
调用可能失败。如果保存失败,则返回false,您可能没有注意到。您可以使用update_attributes!
:
current_client.update_attributes!(is_active: true)
如果出现此问题,您可以使用#update_attribute。
绕过验证检查sub.status
的其他值,并将is_active
设置为false,如果它们未处于活动状态。current_client
方法检查是否存在“电子邮件”Cookie,然后使用来自params[:email]
的电子邮件,而不是cookies["email"]
。它应该使用cookies
或params
,而不是两者!