【问题标题】:why is this method always returning false even when no error为什么即使没有错误,此方法也总是返回 false
【发布时间】:2013-06-13 20:38:16
【问题描述】:

我正在开发一个 Rails 应用程序,它允许使用 Stripe 注册高级会员资格,并且正如人们所期望的那样,可以取消该会员资格。为了取消成员资格,用户单击一个按钮,触发 Promembers_controller.rb 中的destroy 操作。在destroy 内部有一个实例方法cancel_subscription 的调用,它与一些JavaScript 一起通过调用customer.cancel_subscription 来处理Stripe 成员资格的取消。检查我的 Stripe 测试记录,会员资格被取消,但是,似乎 cancel_subscription 方法返回 false,因为这个不成功的重定向一直在运行

redirect_to (:back),  :notice => "Not successful. Please try again or contact us."

以及destroy 操作中的其余代码(即在@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 

Promember.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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    cancel_subscription 末尾的 false 会导致隐式返回。基本上,在 Ruby 中,如果不存在 return 语句,则方法将返回最终语句的计算结果。在这种情况下,它相当于return false。您可以尝试在这样的适当位置添加return true,因为您希望在删除成功时返回true。

    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])
                    return true
                  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
    

    【讨论】:

    • 这不是问题。从rescue 块返回的false 永远不会执行,除非发生异常。
    • 你是对的!但是,如果 user.practices.delete(user.practices[1]) 没有返回真实值,这可能仍然有帮助。
    • 这才是真正的问题。嵌套条件的隐式返回值变得很奇怪。如果您打算使用返回值,最好明确说明。
    • @JimStewart 那么问题是什么以及如何解决?
    • 检查user.practices.delete(user.practices[1]) 的返回值。如果这不返回真/假值,您需要显式返回一个,如我上面的示例所示。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2022-06-28
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多