Rails 3.渲染验证错误

时间:2012-05-30 14:47:27

标签: ruby-on-rails ruby

我有一个表单,用户可以在其中输入发票付款。所以......

invoice has_many   :payments
payment belongs_to :invoice

问题是,当出现验证错误时,假设用户没有输入所需的付款日期,我收到此错误...

undefined method invoice_number for nil:NilClass
Extracted source (around line #10):
7: 
8: <div class="content-box-content">
9:   <div class="tab-content default-tab" style="display: block; ">     
10:   <h4>Invoice #<%= @invoice.invoice_number %> for <%= @invoice.company.name %></h4>
11:     <p>Invoice Balance $<%= sprintf("%.2f", @invoice.balance) %></p>
12:   </div>
13: </div>

payments_controller.rb
----------------------
def new
  @invoice = Invoice.find(params[:invoice_id])
  @payment = @invoice.payments.build

  respond_to do |format|
    format.html
  end
end

def create
  @payment = Payment.new(params[:payment])
  respond_to do |format|
    if @payment.save
      format.html { redirect_to payments_path, notice: 'Payment was successfully created.' }
    else
      format.html { render action: "new" }
    end
  end
end

所以我知道我必须在render action: "new"的某处将@invoice添加到创建操作中。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

只需在执行@invoice = @payment.invoice之前添加format.html { render action: "new" },一切正常

def create
  @payment = Payment.new(params[:payment])
  respond_to do |format|
    if @payment.save
      format.html { redirect_to payments_path, notice: 'Payment was successfully created.' }
    else
      @invoice = @payment.invoice
      format.html { render action: "new" }
    end
  end
end

调用渲染以执行与正在管理的操作不同的操作,只会呈现该操作的视图。它不会调用正在呈现的动作的方法。

换句话说:format.html { render action: "new" }仅使用创建操作中指定的变量加载new.html.erb,甚至不会触及def new。因此,@invoice参数不存在,因为您从未在创建操作中定义它。