我的出价表单中有一个hidden_field,用于将post_id添加到出价中:
<%= f.hidden_field :post_id, :value => @post.id %>
但是,当我向我的出价模型添加验证时 - 例如:
class Bid < ActiveRecord::Base
belongs_to :post
validates :price, presence: true
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :company_email, presence: true,
format: { with: VALID_EMAIL_REGEX}
end
只有在我的某个验证失败时才会收到以下错误。如果没有失败,则会正确保存出价:
Bids中的NoMethodError #create:undefined method`id&#39;为零:NilClass和
<%= f.hidden_field :post_id, :value => @post.id %>
以红色突出显示。
出价控制器:
class BidsController < ApplicationController
def new
@bid = Bid.new
@post = Post.find(params[:id])
end
def show
@bid = bids.find(params[:id])
end
def index
@bid = bids.all
end
def create
@bid = Bid.new(bid_params)
if @bid.save
redirect_to root_path
flash[:notice] = 'Bid received!'
else
render 'new'
end
end
def bid_params
params.require(:bid).permit(:price, :company_name, :company_street, :company_city,
:company_zip, :company_phone, :company_email, :post_id)
end
end
出价
<%= form_for(@bid) do |f| %>
<%= render 'shared/error_messages' %>
<div style='float: left; width: 50%;'>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= f.label "Price" %>
<%= f.text_field :price, class: "form-control" %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit "Submit bid", class: "btn btn-primary" %>
</div>
</div>
</div>
<% end %>
答案 0 :(得分:0)
验证失败时,params [:id]不会再次传递给新操作。你可以:
使用params [:id]:
提交另一个hidden_field<%= f.hidden_field :post_id, :value => params[:id] %>
然后在new
操作中
def new
@bid = Bid.new
@post = Post.find(params[:id]) || Post.find(params[:post_id])
end
如果验证失败,则在创建操作中使用id参数进行渲染:
def create
@bid = Bid.new(bid_params)
if @bid.save
redirect_to root_path
flash[:notice] = 'Bid received!'
else
render 'new', id: params[:id]
end
end
答案 1 :(得分:0)
查看您的创建操作: 验证失败后,它将执行以下操作:
# on create action
else
render 'new'
end
正确?这意味着它将呈现新动作的视图文件。但是你注意到在这个创建动作中没有这样的@post实例变量你加载Post吗? 这样的小技巧也是如此:
else
@post = Post.find(bid_params[:post_id])
render 'new'
end
现在,您已经在@post实例变量上加载了您的帖子记录。动作渲染:new表示您只是渲染该控制器的新动作方法的视图文件。
希望你明白我的意思!