如何修复此错误 "undefined method `encoding' for nil:NilClassa " 并使取消订阅计划生效?
How to fix this error "undefined method `encoding' for nil:NilClassa " and get canceling subscription plan worked?
这是我第一次使用 Stripe 和 Rails,现在我正在尝试让高级用户取消他们的订阅。
我可以使用我的代码将用户从标准级别升级到高级级别,但是当我尝试将高级用户降级到标准级别时遇到问题。
我关注了 Stripe Ruby API "Cancel a subscription" 的引用:https://stripe.com/docs/api?lang=ruby#cancel_subscription,但是当我点击 "cancel subscription" 按钮时出现了这个错误:
NoMethodError - 未定义的方法encoding' for nil:NilClass:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/cgi/util.rb:7:in
escape'
条纹 (1.21.0) lib/stripe/list_object.rb:19:in retrieve'
app/controllers/subscriptions_controller.rb:55:in
降级'
我的rails版本是4.2.1。
我的代码:
class SubscriptionsController < ApplicationController
def create
subscription = Subscription.new
stripe_sub = nil
if current_user.stripe_customer_id.blank?
# Creates a Stripe Customer object, for associating with the charge
customer = Stripe::Customer.create(
email: current_user.email,
card: params[:stripeToken],
plan: 'premium_plan'
)
current_user.stripe_customer_id = customer.id
current_user.save!
stripe_sub = customer.subscriptions.first
else
customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
stripe_sub = customer.subscriptions.create(
plan: 'premium_plan'
)
end
current_user.subid = stripe_sub.id
current_user.subscription.save!
update_user_to_premium
flash[:success] = "Thank you for your subscription!"
redirect_to root_path
# Handle exceptions
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to new_subscriptions_path
end
def downgrade
customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
customer.subscriptions.retrieve(current_user.subid).delete
downgrade_user_to_standard
flash[:success] = "Sorry to see you go."
redirect_to user_path(current_user)
end
end
应用程序控制器:
class ApplicationController < ActionController::Base
def update_user_to_premium
current_user.update_attributes(role: "premium")
end
def downgrade_user_to_standard
current_user.update_attributes(role: "standard")
end
end
config/initializers/stripe.rb:
Rails.configuration.stripe = {
publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
secret_key: ENV['STRIPE_SECRET_KEY']
}
# Set our app-stored secret key with Stripe
Stripe.api_key = Rails.configuration.stripe[:secret_key]
任何帮助将不胜感激!
更新:
感谢 stacksonstacks 的帮助,我只需要在 'current_user.subid = stripe_sub.id' 下断言 'subscription.user = current_user',然后在降级方法中使用 "subscription = current_user.subscription" 调用订阅 ID。现在可以取消订阅了!
好像current_user.subid
returnsnil
这一行:
customer.subscriptions.retrieve(current_user.subid).delete
您为 current_user
分配了 subid
,但您从未保存更改。
您只保存新创建的 subscription
.
current_user.subid = stripe_sub.id
current_user.subscription.save!
如果你加上current_user.save!
我想这会解决问题
希望对您有所帮助
这是我第一次使用 Stripe 和 Rails,现在我正在尝试让高级用户取消他们的订阅。
我可以使用我的代码将用户从标准级别升级到高级级别,但是当我尝试将高级用户降级到标准级别时遇到问题。
我关注了 Stripe Ruby API "Cancel a subscription" 的引用:https://stripe.com/docs/api?lang=ruby#cancel_subscription,但是当我点击 "cancel subscription" 按钮时出现了这个错误:
NoMethodError - 未定义的方法encoding' for nil:NilClass:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/cgi/util.rb:7:in
escape'
条纹 (1.21.0) lib/stripe/list_object.rb:19:in retrieve'
app/controllers/subscriptions_controller.rb:55:in
降级'
我的rails版本是4.2.1。
我的代码:
class SubscriptionsController < ApplicationController
def create
subscription = Subscription.new
stripe_sub = nil
if current_user.stripe_customer_id.blank?
# Creates a Stripe Customer object, for associating with the charge
customer = Stripe::Customer.create(
email: current_user.email,
card: params[:stripeToken],
plan: 'premium_plan'
)
current_user.stripe_customer_id = customer.id
current_user.save!
stripe_sub = customer.subscriptions.first
else
customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
stripe_sub = customer.subscriptions.create(
plan: 'premium_plan'
)
end
current_user.subid = stripe_sub.id
current_user.subscription.save!
update_user_to_premium
flash[:success] = "Thank you for your subscription!"
redirect_to root_path
# Handle exceptions
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to new_subscriptions_path
end
def downgrade
customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
customer.subscriptions.retrieve(current_user.subid).delete
downgrade_user_to_standard
flash[:success] = "Sorry to see you go."
redirect_to user_path(current_user)
end
end
应用程序控制器:
class ApplicationController < ActionController::Base
def update_user_to_premium
current_user.update_attributes(role: "premium")
end
def downgrade_user_to_standard
current_user.update_attributes(role: "standard")
end
end
config/initializers/stripe.rb:
Rails.configuration.stripe = {
publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
secret_key: ENV['STRIPE_SECRET_KEY']
}
# Set our app-stored secret key with Stripe
Stripe.api_key = Rails.configuration.stripe[:secret_key]
任何帮助将不胜感激!
更新: 感谢 stacksonstacks 的帮助,我只需要在 'current_user.subid = stripe_sub.id' 下断言 'subscription.user = current_user',然后在降级方法中使用 "subscription = current_user.subscription" 调用订阅 ID。现在可以取消订阅了!
好像current_user.subid
returnsnil
这一行:
customer.subscriptions.retrieve(current_user.subid).delete
您为 current_user
分配了 subid
,但您从未保存更改。
您只保存新创建的 subscription
.
current_user.subid = stripe_sub.id
current_user.subscription.save!
如果你加上current_user.save!
我想这会解决问题
希望对您有所帮助