【问题标题】:How to use Rails .build to create a user with a stripe subscription如何使用 Rails .build 创建具有条带订阅的用户
【发布时间】:2013-09-05 00:45:50
【问题描述】:

我正在使用 Rails + Devise 和 Stripe 进行计费。我正在努力创建一个控制器方法,该方法同时创建一个具有订阅的用户,但遇到了错误。我的控制器方法:

def signup_w_cc
    @user = User.new(:email => params[:user][:email]
    @user.subscriptions.build(:stripe_card_token => params[:stripe_card_token],
                                              :plan_id => 1,
                                              :quantity => 1)
    @user.save
end

这失败了,当我执行@user.save 时,订阅模型没有获得所需的 user_id 字段。我使用构建不正确吗?这个想法不是创建用户然后订阅,因为它们都需要同时提交或回滚。

user.rb

  has_many :subscriptions

subscription.rb

belongs_to :user

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 stripe-payments


    【解决方案1】:

    是的,您的订阅对象不会有 user_id,因为该用户尚未持久化。没有可用的 ID。

    要修复,首先尝试更改顺序以保存用户。然后@user.subscription 将附加一个 user_id。

    @user = User.new(:email => params[:user][:email]
    @user.save # Save and get id at first.
    @user.subscriptions.build(:stripe_card_token => params[:stripe_card_token],
                                              :plan_id => 1,
                                              :quantity => 1)
    

    【讨论】:

    • 这就是问题所在。我需要他们同时保存或不保存。如果订阅失败,这个答案的问题,现在我们创建了一个没有订阅的用户。
    • @AnApprentice,我理解您的担忧,但没有可以订阅的用户?您也不能使用transaction,因为付款是外部服务。我的建议是保留他们,因为他们可能打算付款但由于外部原因而失败。如有必要,您可以向他们发送电子邮件以提供帮助。但是如果你真的不想要它们,你可以运行一个后端作业来定期删除那些失败的。
    【解决方案2】:

    我相信,如果您希望从您的关系中获得这种意识,您需要为他们添加inverse_of 选项:

    User
    
    has_many :subscriptions, inverse_of: :user
    
    
    Subscription
    
    belongs_to :user, inverse_of: :subscriptions
    

    有关inverse_of 选项的更多信息,请在此页面中搜索术语inverse_of,直到找到has_many 代码:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2014-07-11
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多