ruby-on-rails - form_for 第一个参数在 rails 4 中不能为 nil 或为空

标签 ruby-on-rails ruby-on-rails-4 form-for stripe-payments

我已经多次看到这个问题出现在 SO 上,并尝试使用推荐的方法来解决问题。我的 form_for 仍然遇到此错误:

First argument in form cannot contain nil or be empty

我有几个字段应该输入到“费用”对象中。我希望表单提交并创建一个收费对象,其中包含我在表单中拥有的适当字段,包括隐藏字段(user_id 和 gift_id)。

模型:

class Gift
  has_many :codes
  has_many :charges

class Code
  belongs_to :gift

class Charge
  belongs_to :user
  belongs_to :gift

class User
  has_many :charges

charges_controller.rb

class ChargesController < ApplicationController

skip_before_filter :verify_authenticity_token, :only => [:new, :create]

def index
    @charges = Charge.all
end 

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

def new
    @charge = Charge.new
end

def create
    @charge = Charge.new(params[:charge_params])
        Stripe.api_key = "sk_test_Ig7H6rhd0jl7W3V48y5pleOa"
        token = params[:stripeToken]
        customer = Stripe::Customer.create(
          :card => token,
          :description => "payinguser@example.com"
        )
        Stripe::Charge.create(
            :amount => gift.price,
            :currency => "cad",
            :customer => customer.id
        )
        save_stripe_customer_id(user, customer.id)

        # Later...
        customer_id = get_stripe_customer_id(user)

        Stripe::Charge.create(
          :amount   => 1500,
          :currency => "cad",
          :customer => customer_id
        )

        if @charge.save 
            redirects_to gifts_path, flash[:notice] = 'It worked'
        else 
            render 'gifts/new'
        end 
end

def edit
    @charge = Charge.find(params[:id])
end

def update
    @charge = Charge.find(params[:id])
    @charge.update_attributes(charge_params)
end

def destroy
    @charge = Charge.find(params[:id])
    @charge.destroy
end

private

def charge_params
    params.require(charge).permit(:sender_name, :recipient_email, :recipient_msg, :stripeToken, :gift_id, :user_id)
end
end 

_new.html.erb(收集​​数据的表格)

<%= form_for @charge do |f| %>

  <%= f.hidden_field :gift_id %>
  <%= f.hidden_field :user_id %>

  <div class="form-group left-inner-addon">
    <i class="glyphicon glyphicon-send"></i>
    <%= f.text_field :sender_name, :class => "form-control", :placeholder => "Sender's Name" %>
  </div>

  <div class="form-group left-inner-addon">
    <i class="glyphicon glyphicon-send"></i>
    <%= f.email_field :recipient_email, :class => "form-control", :placeholder => "Recipient's Email" %>
  </div>

  <div class="form-group left-inner-addon">
    <i class="glyphicon glyphicon-pencil"></i>
    <%= f.text_field :recipient_msg, :class => "form-control", :placeholder => "Message to Recipient" %>
  </div>

  <div class="form-group left-inner-addon ">
    <i class="glyphicon glyphicon-credit-card"></i>
    <%= f.text_field "data-stripe" => "number", :class= => "form-control", :placeholder => "Credit Card Number" %>
  </div>

   <div class="form-group">
     <div class="row">
       <div class="col-xs-4 left-inner-addon ">
         <i class="glyphicon glyphicon-calendar"></i>
         <%= f.text_field "data-stripe" => "exp-month", :class => "form-control", :placeholder => "MM" %>
       </div>
       <div class="col-xs-5 left-inner-addon ">
         <i class="glyphicon glyphicon-calendar"></i>
         <%= f.text_field "data-stripe" => "exp-year", :class => "form-control", :placeholder => "YYYY" %>
       </div>
     </div>
   </div>

   <div class="form-group">
     <div class="row">
       <div class="col-xs-5 left-inner-addon ">
         <i class="glyphicon glyphicon-ok-circle"></i>
         <%= f.text_field "data-stripe" => "cvc", :class => "form-control", :placeholder => "CVC" %>
       </div>
     </div>
   </div>
   <%= f.submit :class => "btn btn-primary", :type => "submit" %>
<% end %>

_show.html.erb(呈现表单的部分)

   <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    <h4 class="modal-title"><center><%= gift.name %></center></h4>
</div>
<div class="modal-body">
    <p><%= image_tag gift.picture.url(:mobile) %></p>
    <p><%= gift.description %></p>
    <p>$<%= gift.price %></p>
    <%= render partial: 'charges/new', :locals => { :gift => gift } %>
</div>
<div class="modal-footer">
</div>

index.html.erb(呈现 _show.html.erb 部分的页面)

<%= title "Redwood | Gifts" %>
<div class="container">
    <div class="row" id="item">
        <% @gifts.each do |gift|  %>
        <div class="col-sm-6 col-md-4">
            <div class="thumbnail">
                <%= image_tag gift.picture.url(:medium) %>
                <div class="caption">
                    <h3><%= gift.name %></h3>
                    <h4><%= link_to gift.merchant.name, merchant_path(gift.merchant.id) %></h4>
                    <p><%= gift.description %></p>
                    <p><%= link_to 'Buy', gift_path(gift), :remote => true, 'data-toggle' =>  "modal", 'data-target' => "#myModal#{gift.id}", :class => "btn btn-primary", 'data-type' => "html" %></p>
                </div>
                <!-- Modal -->
                    <div class="modal fade" id="myModal<%= gift.id %>">
                        <div class="modal-dialog">
                            <div class="modal-content">
                                <%= render partial: 'show', :locals => { :gift => gift } %>
                            </div>
                        </div>
                    </div>
                <!-- End of Modal -->
            </div>
        </div>
        <% end %>
    </div>
</div>

最佳答案

您的"new"部分由您的“显示”部分呈现,然后“显示”部分由您的“索引” View 呈现。这意味着它只是正在运行的“索引”操作中的代码。由于您没有在索引操作中实例化名为@charge 的实例变量,@charge 将在"new"部分中返回 nil。这就是您收到该错误的原因。

要修复该错误,您应该将以下代码添加到您的索引操作中:

@charge = Charge.new

这样,@charge 将返回一个 Charge 实例而不是 nil。您也可以选择不使用"new"部分,只在其自身的"new" View 中显示用于创建新费用的表单,以便它在"new"操作中运行代码。

希望对您有所帮助!

关于ruby-on-rails - form_for 第一个参数在 rails 4 中不能为 nil 或为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845640/

相关文章:

ruby-on-rails - 将参数传递给 rake 任务时出现问题

ruby-on-rails-4 - 在 Rails 应用程序中验证电话号码的服务(例如 Twilo、Plivo、Nexmo)

ruby-on-rails - 命名空间 form_for 中的嵌套资源

ruby - Sidekiq Worker 在排队后需要很长时间才能执行(4 - 6 秒)

ruby-on-rails - 将 'Please match the format requested.' 更改为其他内容?

ruby-on-rails - 调用没有 ID 的新方法的路由问题

ruby-on-rails - 如何为另一个语言环境提供自定义错误消息? (行动邮件)

ruby-on-rails - 许多不同模型的评论 : polymorphic or not? (Ruby on Rails)

ruby-on-rails - rails : How to delete a pending migration

ruby-on-rails - 对于 Rails with Passenger 在子目录中进行页面缓存,我的 Nginx 重写规则应该是什么?