0

User.rb クラスと Promember.rb クラスを持つ Rails アプリがあります。Promember.rb belongs_to :user と User.rb has_one :promember です。

私の Promember.rb モデルでは、次のupdate_stripe方法 (このチュートリアルhttps://tutorials.railsapps.org/tutorials/rails-stripe-membership-saasから適応) を使用して、Stripe を介したプロメンバーシップのサインアップを処理しています。customer_id が存在しない場合 (つまり、新規顧客の場合)、Stripe::Customer.create メソッドを呼び出すと、関連付けられたユーザー インスタンスから電子メールと名前の情報を取得しています (少なくとも、私はそうしていると思います)。

  :email => user.email,
  :description => user.name,

これは、新しい Stripe 顧客の作成には問題なく機能しますが、customer_id が存在する状況では (そして、私は新しい顧客を作成していません)、このようにユーザーから名前と電子メールを取得しようとします。

  customer.description = user.name
  customer.email = user.email

このエラーが発生しています

NoMethodError in PromembersController#create
undefined method `name' for nil:NilClass

この状況で「ユーザー」が nil になるのはなぜですか?

    def update_stripe

    if customer_id.nil?

        customer = Stripe::Customer.create(
          :email => user.email,
          :description => user.name,
          :card => stripe_token,
          :plan => '1'
        )

    else
      customer = Stripe::Customer.retrieve(customer_id)
      if stripe_token.present?
        customer.card = stripe_token
      end
      customer.description = user.name
      customer.email = user.email
      customer.save
    end
    self.last_four_digits = customer.active_card.last4
    self.customer_id = customer.id
    self.stripe_token = nil
  rescue Stripe::StripeError => e
    logger.error "Stripe Error: " + e.message
    errors.add :base, "#{e.message}."
    self.stripe_token = nil
    false
  end

アップデート

これは create アクションです (Rails 4 アプリで強力なパラメーターを使用)

def create
    @promember = current_user.build_promember(promember_params)

 if @promember.save
    current_user.add_role :pro

  redirect_to   lawyer_profile_path(current_user), :notice => "award created question. It will be reviewed if you checked box"
else

    redirect_to (:back),  :notice => "There was an error."

  end 
end



  private
def promember_params

  params.require(:promember).permit(:pro, :customer_id, :user_id, :last_four_digits, :stripe_token, :stripe_card_token)
end

アップデート

これらは create メソッドに渡されるパラメータです

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"3zq3tFwp1AgR3yBWGenW45kLqUzVlg96dP8Haa4bVKQ=", "promember"=>{"stripe_token"=>""}, "commit"=>"Create Promember"}
{"utf8"=>"✓", "authenticity_token"=>"3zq3tFwp1AgR3yBWGenW45kLqUzVlg96dP8Haa4bVKQ=", "promember"=>{"stripe_token"=>""}, "commit"=>"Create Promember", "action"=>"create", "controller"=>"promembers"}
promemberparams
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 22 ORDER BY "users"."id" ASC LIMIT 1
  Promember Load (31.4ms)  SELECT "promembers".* FROM "promembers" WHERE "promembers"."user_id" = $1 ORDER BY "promembers"."id" ASC LIMIT 1  [["user_id", 22]]
   (0.2ms)  BEGIN
   (0.3ms)  ROLLBACK
Completed 500 Internal Server Error in 3586ms

NoMethodError (undefined method `name' for nil:NilClass):
  app/models/promember.rb:38:in `update_stripe'
  app/controllers/promembers_controller.rb:16:in `create'
4

0 に答える 0