将 Stripe 支付与 create 方法集成

Integrate Stripe payments with create method

我想在控制器中将 stripe charges 与我的创建方法正确集成。

   def create
    @individual_training = IndividualTraining.new(individual_training_params)
    Stripe.api_key = ENV['STRIPE_SECRET_KEY']
    token = params[:stripeToken]
    begin
      charge = Stripe::Charge.create(
        amount: (@individual_training.training_cost.cost * 100).floor,
        currency: 'pln',
        card: token
      )
    rescue Stripe::CardError => e
      flash[:danger] = e.message
      render :new
    end

    if @individual_training.save
      redirect_to :back, notice: 'Pomyślnie dodano.'
    else
      render :new
    end
  end

问题在于正确验证整个表单。除了 Stripe 字段,我还有为 @individual_training 设计的字段。当 Stripe 没有任何错误,但 @individual_training 有错误时,stripe 注册付款。我想在@individual_training.save 为真时记录条纹费用,反之亦然。

如果表格的第一部分(条纹字段)和第二部分(@individual_training 字段)中的数据正确,则应注册付款并@individual_training.save.

希望把问题说清楚

根据您在评论中所写的内容,以下内容应该适合您

 def create
    @individual_training = IndividualTraining.new(individual_training_params)
    ..
    if @individual_training.valid? # run validation, ensure it's ok, but not yet save
      begin
        charge = Stripe::Charge.create(..) # if there is exception rescue block is called
        ...
        # unless you modified individual_training following save will be positive
        if !charge.errors? && @individual_training.save # save should be true as you checked valid? before
          redirect_to :back, notice: 'error'
        else
          render :new # this is if charge has errors
        end          
      rescue Stripe::CardError => e
        flash[:danger] = e.message
        render :new
      end     
    else # this happens if individual_training  is not valid
      render :new
    end
  end

charge.errors?的代码应该改为实际检查Stripe操作结果。