0

我正在使用 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 字段。我使用构建不正确吗?这个想法不是创建用户然后订阅,因为它们都需要同时提交或回滚。

用户.rb

  has_many :subscriptions

订阅.rb

belongs_to :user

谢谢

4

2 回答 2

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)
于 2013-09-02T01:40:19.393 回答
0

我相信,如果您希望从您的关系中获得这种意识,您需要为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

这有帮助吗?

于 2013-09-02T00:58:49.533 回答