代码之家  ›  专栏  ›  技术社区  ›  Hamed Saadat

创建时缺少参数或值为空

  •  0
  • Hamed Saadat  · 技术社区  · 11 年前

    我在用户和订阅模型之间有一对一的关系,使用Stripe进行支付,使用design进行用户身份验证,使用Pundit进行角色验证。

    当我通过创建操作创建订阅模型时 param is missing or the value is empty 错误,因为我的表单没有传递@subscription对象。为什么我的@订阅没有通过params传递?

    以下是我的SubscriptionsController代码:

    class SubscriptionsController < ApplicationController
      before_filter :authenticate_user!
      after_action :verify_authorized
    
     # def index
     #  end
     #
     #  def show
     #  end
    
      def new
        @subscription = Subscription.new
        authorize @subscription
      end
    
      def edit
      end
    
      def create
        # create the customer first if it doesn't exist
        if (current_user.customer_id.blank?)
          customer = Stripe::Customer.create(:email => current_user.email, :card => params[:stripeToken])
          current_user.customer_id = customer.id
          current_user.save!
        end
    
        @subscription = current_user.create_subscription(secure_params)
        @subscription.save_with_payment
        authorize @subscription
      end
    
      def secure_params
        params.require(:subscription).permit(:stripeToken, :plan_id)
      end
    
    end
    

    这里是订阅模型:

    class Subscription < ActiveRecord::Base
      belongs_to :user
    
      def save_with_payment
        if valid?
          # first get the customer id from the subscriber
          customer = Stripe::Customer.retrieve(user.customer_id)
    
          if (@subscription_id.blank?)
            stripe_sub = customer.subscriptions.create(:plan => plan_id)
            @subscription_id = stripe_sub.id
          else
            stripe_sub = customer.subscriptions.retrieve(subscription_id)
            stripe_sub.plan = plan_id
            stripe_sub.save
          end
    
          @plan_id = plan_id
          save
        end
      end
    
    end
    

    这是表单代码 new.html.erb :

    <%= form_for @subscription do |f| %>
      <% if @subscription.errors.any? %>
        <div class="error_messages">
          <h2><%= pluralize(@subscription.errors.count, "error") %> prohibited this subscription from being saved:</h2>
          <ul>
          <% @subscription.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
          <% end %>
          </ul>
        </div>
      <% end %>
      <div class="form-row">
          <%= f.label :plan_id, "Plan " %>
          <%= text_field_tag :plan_id, nil %>
      </div>
      <div class="form-row">
          <%= f.label :card_number, "Credit Card Number " %>
          <%= text_field_tag :card_number, nil, {'data-stripe' => 'number'} %>
      </div>
      <div class="form-row">
          <%= f.label :card_code, "Security Code on Card (CVV)" %>
          <%= text_field_tag :card_code, nil, {'data-stripe' => 'ccv'} %>
      </div>
      <div class="form-row">
        <%= f.label :card_month, "Card Expiration" %>
        <%= select_month nil, {add_month_numbers_true: true}, {name: nil, id: "card_month", 'data-stripe' => 'exp_month'} %>
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year", 'data-stripe' => 'exp_year'} %>
      </div>
        <div class="payment-errors">
            <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
          </div>
      <div class="actions"><%= f.submit "Subscribe" %></div>
    <% end %>
    

    最后,这里是我的请求参数

    {"utf8"=>"✓", "authenticity_token"=>"d5tcFSiFw1XIcPou3HTrISSOIObujo0XfUq+MTNihuk=", 
    "plan_id"=>"basic_yearly", "card_number"=>"4242 4242 4242 4242", "card_code"=>"123", 
    "action"=>"create", "controller"=>"subscriptions"}
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Hamed Saadat    11 年前

    原来我是在混合和匹配form_for助手和表单标记。

    要使其工作,请转动以下按钮:

    <%= text_field_tag :plan_id, nil %>
    

    进入

    <%= f.text_field :plan_id %>