2009-04-27 24 views
1

在我的審查模式,我有以下幾點:validates_presence_of無法正常工作...如何調試?

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

當@review對象無效時(由...構造。new(params [:review])方法,它會在@ review.save中失敗。此時,您將被重定向到您的new_review_path,但您需要嘗試設置與「新」方法中相同的@review對象。含義 - 如果「.save」在重定向之前失敗,則加載@vendor對象並將其修補到您的@review對象中。 – 2009-05-08 07:41:23

回答

0

您可能沒有@vendor成員變量集 - 但要解決此問題,直接使用不是@vendor,而是通過您的@review變量實例更正確。

如果您正在創建新評論,您已經創建了@review成員變量,並且您只是在其中填充字段 - 所以,您需要爲@review設置供應商(除非它是可選的)......它會更正確地使用@ review.vendor.name。

(如果供應商是可選的,那麼你顯然必須捕獲所有vendor.nil?案件。)

0

您在ReviewsControllernewcreate動作中有什麼代碼?

我懷疑你的新Review失敗驗證因爲summary字段爲空,然後當表單驗證失敗重新顯示,該@vendor實例變量是nil

您需要確保爲@vendor分配了兩個代碼路徑的值。

+0

這可能是它,雖然我試圖讓vendor /:vendor_id/reviews成爲路徑...我已經添加了我的新動作 – Angela 2009-04-30 23:01:30

+0

我認爲它失敗的URL是錯誤的......不確定如何設置它以便供應商/:vendor_id/review/new在驗證失敗時顯示錶單? – Angela 2009-04-30 23:15:40

+0

好吧,我沒有給供應商分配一個值,但正如你所看到的,我正在嘗試使用restful以使vendor_id在路徑中? – Angela 2009-05-05 02:32:57

0

我認爲你需要render :action => 'new',而不是你redirect_to new_review_path(@review)。這將使您的error_messages保持在@review對象上。通過重定向你正在失去舊對象並創建一個新對象。正如其他人所說的,在呈現視圖之前,您還需要確保在create方法中重新填充@vender變量。

PS。我喜歡使用ardes resources_controller plugin來執行像這樣的bog標準控制器動作,使我的生活更輕鬆,並且它非常好地處理嵌套資源。