Чередующийся неопределенный метод customer_id - PullRequest
0 голосов
/ 18 сентября 2018

Таким образом, в настоящее время у меня есть эта функция бронирования, к которой я пытаюсь добавить платежную систему, используя Stripe

Однако, когда я пытаюсь отправить форму данных моей кредитной карты, я получаю эту ошибку:

NoMethodError (undefined method `customer_id' for #<User:0x552abc0>):

app/services/credit_card_service.rb:8:in `create_credit_card'
app/controllers/charges_controller.rb:9:in `create' 

Когда я смотрю на код в файлах, которые указаны в приведенной выше ошибке, вот что там:

#app/controllers/charges_controller.rb


class ChargesController < ApplicationController

  before_action :authenticate_user!
  before_action :find_product

  def create
    stripe_card_id =
      if params[:credit_card].present?
        CreditCardService.new(current_user.id, card_params).create_credit_card
      else
        charge_params[:card_id]
      end

    Stripe::Charge.create(
      customer: current_user.customer_id,
      source:   stripe_card_id,
      amount:   @booking.price_in_cents,
      currency: 'usd'
    )

    if params[:credit_card].present? && stripe_card_id
      current_user.credit_cards.create_with(card_params).find_or_create_by(stripe_id: stripe_card_id)
    end
  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to @booking
  end

  private

  def card_params
    params.require(:credit_card).permit(:number, :month, :year, :cvc)
  end

  def charge_params
    params.require(:charge).permit(:card_id)
  end

  def find_product
    @booking = Booking.find(params[:booking_id])
  rescue ActiveRecord::RecordNotFound => e
    flash[:error] = 'Booking not found!'
    redirect_to root_path
  end
end

и

class CreditCardService
  def initialize(user_id, card)
    @user = User.find(user_id)
    @card = card
  end

  def create_credit_card
    customer = Stripe::Customer.retrieve(@user.customer_id)
    customer.sources.create(source: generate_token).id
  end

  def generate_token
    Stripe::Token.create(
      card: {
        number: @card[:number],
        exp_month: @card[:month],
        exp_year: @card[:year],
        cvc: @card[:cvc]
      }
    ).id
  end
end

Любая помощь или советы о том, как решить эту проблему, будет принята с благодарностью.

Я использовал devise для входа в систему / регистрации пользователя

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если я правильно читаю, похоже, у вашей User -модели просто нет атрибута customer_id.Вам нужно определить это и сохранить идентификатор клиента Stripe (как предложено выше Nithin).

0 голосов
/ 18 сентября 2018

AFAIK,

Вам нужно создать клиента в самой Stripe

Ex:

response = Stripe::Customer.create({ email: 'email@example.com' })

затем сохраните ответ в новом столбце миграции, используя

response[:id] which return customer_id from stripe

...