validates_presence_of无法正常工作......如何调试?

时间:2009-04-27 20:24:12

标签: ruby-on-rails validation

在我的评论模型中,我有以下内容:

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呢?

3 个答案:

答案 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标准控制器操作,让我的生活变得更轻松对我来说并且它非常好地处理嵌套资源。