私は開発中の Rails アプリを持っており、Stripe でプレミアム メンバーシップにサインアップし、予想通り、そのメンバーシップをキャンセルすることができます。destroy
メンバーシップをキャンセルするには、ユーザーは Promembers_controller.rb 内のアクションをトリガーするボタンをクリックします。内部destroy
には、インスタンス メソッドへの呼び出しがあり、cancel_subscription
いくつかの JavaScript と共に、 を呼び出して、Stripe のメンバーシップのキャンセルを処理しcustomer.cancel_subscription
ます。Stripe テスト レコードを確認すると、メンバーシップはキャンセルされていcancel_subscription
ますが、この失敗したリダイレクトが実行され続けるため、メソッドが false を返しているようです。
redirect_to (:back), :notice => "Not successful. Please try again or contact us."
およびアクション内の残りのコードdestroy
(つまり、after@promember.cancel_subscription(id)
は実行されません。
質問: (これは借用したコードです)。cancel_subscription メソッドはfalse
、レスキューの最後に (レスキューが行われていない場合でも) 常に返されるようにelse
なっていますか?それが、破棄アクションの句のリダイレクトが常に呼び出される理由ですか? 私がやろうとしていることを達成するためのより良い方法は何ですか?
Promembers_controller.rb
def destroy
id = current_user.customer_id
@promember = current_user.promember
if @promember.cancel_subscription(id)
session[:pro] = nil
current_user.customer_id = nil #is not getting run
current_user.promember.delete #is not getting run
current_user.last_four_digits = nil #is not getting run
current_user.save
redirect_to lawyer_profile_path(current_user), :notice => "Premium membership has been cancelled."
else
redirect_to (:back), :notice => "Not successful. Please try again or contact us."
end
end
プロメンバー.rb
def cancel_subscription(customer_id)
unless customer_id.nil?
customer = Stripe::Customer.retrieve(customer_id)
unless customer.nil? or customer.respond_to?('deleted')
if customer.subscription.status == 'active'
customer.cancel_subscription
user.remove_role :pro
if user.practices.size > 1
user.practices.delete(user.practices[1])
end
end
end
end
rescue Stripe::StripeError => e
logger.error "Stripe Error: " + e.message
errors.add :base, "Unable to cancel your subscription. #{e.message}."
false
end