nil的未定义方法`stripe_card_token':NilClass

时间:2014-06-06 09:39:16

标签: ruby-on-rails ruby-on-rails-4 payment-gateway erb stripe-payments

我正在尝试将条带集成到我的rails4应用程序中接收付款/捐赠。我得到undefined method "stripe_card_token" for nil:NilClass我不明白为什么会这样。

起初我认为这是字符串参数的问题,但它仍然无法正常工作,不确定原因。我做了一个我无法发现的拼写错误吗?任何指导赞赏。

收费控制器

class ChargesController < ApplicationController

    def new
        @charge = Charge.new
    end

    def create
      @charge = Charge.new(charges_params)
      if @charge.save_with_payment
        redirect_to @charge, :notice => "Thank you for subscribing!"
      else
        render :new
      end
    end

    def charges_params
        params.require(:charge).permit(:stripe_card_token)
    end

end

收费模式:

class Charge < ActiveRecord::Base

    attr_accessor :stripe_card_token

    def save_with_payment
      if valid?
        customer = Stripe::Customer.create(card: stripe_card_token)
        self.stripe_customer_token = customer.id
        save!
      end
    rescue Stripe::InvalidRequestError => e
      logger.error "Stripe error while creating customer: #{e.message}"
      errors.add :base, "There was a problem with your credit card."
      false
    end

end

我的比赛#show view:

<%= form_for @charge do |f| %>
          <% if @charge.errors.any? %>
            <div class="error_messages">
                <h2><%= pluralize(@charge.errors.count, "error") %> prohibited this               charge from being saved: </h2>
                <ul>
                <% @charge.errors.full_messages.each do |msg| %>
                    <li><%= msg %></li>
                <% end %>
                </ul>
            </div>
          <% end %>

            <%= f.hidden_field :stripe_card_token %>
            <%= f.hidden_field :contest_id %>
            <%= f.hidden_field :user_id %>

            <div class="field">
                <%= f.label :amount %>
                <%= f.text_field :amount %>
            </div>

            <% if @charges.stripe_card_token.present? %>
              Credit card has been provided.
            <% else %>
              <div class="field">
                <%= label_tag :card_number, "Credit Card Number" %>
                <%= text_field_tag :card_number, nil, name: nil %>
              </div>
              <div class="field">
                <%= label_tag :card_code, "Security Code on Card (CVV)" %>
                <%= text_field_tag :card_code, nil, name: nil %>
              </div>
              <div class="field">
                <%= label_tag :card_month, "Card Expiration" %>
                <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %>
                <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %>
              </div>
            <% end %>
            <div id="stripe_error">
              <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
            </div>

        <% end %>

我的收费架构表:

  create_table "charges", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "stripe_customer_token"
    t.integer  "contest_id"
    t.integer  "user_id"
    t.decimal  "amount"
  end

我的比赛控制器展示行动:

  def show
    @contest = Contest.find(params[:id])
    @charge = Charge.new
  end

1 个答案:

答案 0 :(得分:1)

<% if @charges.stripe_card_token.present? %>

您在控制器中将其称为@charge,您尚未定义@charges