ruby-on-rails - 如何修复此错误 "undefined method ` 编码' for nil :NilClassa "and get canceling subscription plan worked?

标签 ruby-on-rails stripe-payments

这是我第一次使用 Stripe 和 Rails,现在我正在尝试允许高级用户取消他们的订阅。

我可以使用代码将用户从标准级别升级到高级级别,但是当我尝试将高级用户降级到标准级别时遇到问题。

我已关注“取消订阅”的 Stripe Ruby API 引用:https://stripe.com/docs/api?lang=ruby#cancel_subscription ,但是当我单击“取消订阅”按钮时出现此错误:

NoMethodError - nil:NilClass 的未定义方法编码: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/cgi/util.rb:7:in转义' stripe (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

应用程序 Controller :

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在这一行返回nil:

customer.subscriptions.retrieve(current_user.subid).delete

您为 current_user 分配了 subid,但从未保存更改。 您只需保存新创建的订阅

current_user.subid = stripe_sub.id
current_user.subscription.save!

如果您添加current_user.save!我认为这会解决问题。

希望有帮助

关于ruby-on-rails - 如何修复此错误 "undefined method ` 编码' for nil :NilClassa "and get canceling subscription plan worked?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29816002/

相关文章:

ruby-on-rails - rails 4 : favicon not showing

css - 更改导航栏颜色不起作用

ruby-on-rails - 使用 rails gem geokit 按距离和分页排序?

sql - rails 4 复杂的 SQL 作用域

c# - Stripe Payments - 如何更改订阅计划并立即收费?

ruby-on-rails - Prawn pdf组、事务和回滚方法问题

php - Stripe 签账卡使用 php Rest api 时出现 fatal error

ios - 如何使用 Stripe 付款

ruby-on-rails - 如何在 Stripe (Rails) 中创建费用和客户

ruby-on-rails - 在活跃商户应用程序中使用两步验证的卡(信用卡/借记卡)会发生什么情况?