在我的评论模型中,我有以下内容:
class Review < ActiveRecord::Base
belongs_to :vendor
belongs_to :user
has_many :votes
validates_presence_of :summary
end
我在网址中提交了以下新条目:
vendors/9/reviews/new
new.html.erb包含如下表单:
<%= error_messages_for 'review' %>
<h1>New review for <%= link_to @vendor.name, @vendor%></h1>
<% form_for(@review, :url =>vendor_reviews_path(@vendor.id)) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :summary %><br />
<%= f.text_area :summary, :rows=>'3', :class=>'input_summary' %>
<%= f.hidden_field :vendor_id, :value => @vendor.id %>
</p>
<p>
<%= f.submit 'Submit Review' %>
</p>
<% end %>
当我离开字段时:摘要为空白,我收到错误,而不是验证消息:
当你没想到它时,你有一个零对象! 评估nil.name
时发生错误提取的来源(第3行):
1: <%= error_messages_for 'review' %>
2:
3: <h1>New review for <%= link_to @vendor.name, @vendor%></h1>
我不明白发生了什么,如果:填充摘要
,则有效 def new
@review = Review.new
@vendor = Vendor.find(params[:vendor_id])
@review = @vendor.reviews.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @review }
end
end
def create
@review = Review.new(params[:review])
#@vendor = Vendor.find(params[:vendor_id]) #instantiate the vendor from the URL id -- NOT WOKRING
#@review = @vendor.reviews.build #build a review with vendor_id -- NOT working
@review = @current_user.reviews.build params[:review]#build a review with the current_user id
respond_to do |format|
if @review.save
flash[:notice] = 'Review was successfully created.'
format.html { redirect_to review_path(@review) }
format.xml { render :xml => @review, :status => :created, :location => @review }
else
format.html { redirect_to new_review_path(@review) }
format.xml { render :xml => @review.errors, :status => :unprocessable_entity }
end
end
end
我的猜测是当它失败时会转到redirect_to new_review_path(@review)
,所以不知道供应商。如何重定向到vendor/:vendor_id/reviews/new
呢?
答案 0 :(得分:0)
您在new
的{{1}}和create
行动中有哪些代码?
我怀疑您的新ReviewsController
验证失败,因为Review
字段为空,然后在验证失败时重新显示表单时,summary
实例变量为{{1} }。
您需要确保为@vendor
分配了两个代码路径的值。
答案 1 :(得分:0)
你可能没有设置@vendor成员变量 - 但是为了解决这个问题,直接使用@vendor更合适,但是通过你的@review变量实例。
如果您正在创建新的评论,您已经创建了@review成员变量,并且您只是在其中填充字段 - 因此,您需要为@review设置供应商(除非它是可选的)...它将是更正确使用@ review.vendor.name。
(如果供应商是可选的,那么你显然必须捕获所有vendor.nil?个案。)
答案 2 :(得分:0)
我认为您需要render :action => 'new'
而不是redirect_to new_review_path(@review)
。这将使您的error_messages保留在@review对象上。通过重定向,您将丢失旧对象并创建一个新对象。
正如其他人所说,您还需要确保在渲染视图之前重新填充create方法中的@vender变量。
PS。我喜欢使用ardes resources_controller plugin 这样的bog标准控制器操作,让我的生活变得更轻松对我来说并且它非常好地处理嵌套资源。