大家好我在尝试保存数据时遇到错误。我已经为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
答案 0 :(得分:1)
有效地,您收到此错误消息是因为
@permits = VisitorPermit.find(params[:visitor_permit_id])
将@permits
设为nil
。无论params[:visitor_permit_id]
是什么,数据库中都没有与VisitorPermit
相对应的id
记录器。我建议您使用pry或byebug之类的内容来确认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
,但是......你似乎只使用了一张许可证。