没有方法错误,nil的未定义方法`created_at':NilClass

时间:2016-10-24 15:38:44

标签: ruby-on-rails ruby-on-rails-4

大家好我在尝试保存数据时遇到错误。我已经为Permits声明了一个实例变量,但我仍然遇到了这个错误。我不知道为什么,任何人都可以帮我这个?

错误来自<%= @permits.created_at %>

<%= form_for(@vinvoice) do |f| %>
        <h2>Time : <%= @permits.created_at %></h2></br>
        <h2>Invoice ID : <%= @permits.id %></h2></br>

        <%= f.label :"Vehicle" %>

这是我的new.html.erb

<% provide(:title, 'Invoice') %>
<h1>Invoice</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3" id="datashow">

    <%= form_for(@vinvoice) do |f| %>
        <h2>Time : <%= @permits.created_at %></h2></br>
        <h2>Invoice ID : <%= @permits.id %></h2></br>


    <%= f.submit "Make Payment", class: "btn btn-primary" %>
<% end %>

这是我的vinvoices_controller.rb

class VinvoicesController < ApplicationController
  def new
    @permits = VisitorPermit.find(params[:visitor_permit_id])
    @vinvoice = Vinvoice.new
  end

  def create
    @vinvoice = Vinvoice.new(vinvoice_params)
    if @vinvoice.save
      flash[:success] = "Visitor Permit created!"
      render 'new'
    else
      flash[:error] = @vinvoice.errors.full_messages.to_sentence
      render 'new'

    end
  end

  private

  def set_vinvoice
    @vinvoice = Vinvoice.find(params[:id])
  end

  def vinvoice_params
    params.require(:vinvoice).permit(:vehicletype, :name, :department, :carplate, :duration, :permitstart, :permitend, :price, :time, :visitor_permit_id)
  end
end

2 个答案:

答案 0 :(得分:1)

有效地,您收到此错误消息是因为

@permits = VisitorPermit.find(params[:visitor_permit_id])

@permits设为nil。无论params[:visitor_permit_id]是什么,数据库中都没有与VisitorPermit相对应的id记录器。我建议您使用prybyebug之类的内容来确认params[:visitor_permit_id]的值。造成这种情况的一个常见原因是params哈希中的键有拼写错误或嵌套,因此您必须执行类似params[:permit][:visitor_permit_id]的操作(仅作为示例。

请参阅SteveTurczyn关于find vs find_by的评论

由于我的监督的教育价值而无法更新

答案 1 :(得分:1)

请注意,您要在@permits方法中定义new,但不是在create方法中定义它。

因此,当create方法检测到问题并呈现您的new表单时,@permits实例变量中的值为nil。

这是导致问题的原因。

Vinvoice对象是否属于VisitorPermit对象?

如果是这样你想做...

def new
  @permits = VisitorPermit.find(params[:visitor_permit_id])
  @vinvoice = Vinvoice.new
  @vinvoice.permit = @permits
end

在表格

中加入许可证ID
<%= f.hidden_field :permit_id
<%= f.submit "Make Payment", class: "btn btn-primary" %>

在创作中,做...

def create
  @vinvoice = Vinvoice.new(vinvoice_params)
  @permits = @vinvoice.permit

我认为一般情况下你想使用@permit而不是@permits,但是......你似乎只使用了一张许可证。