2011-02-23 95 views
1

我有一個顯示一本書的頁面,它有很多評論。在這個頁面上還有一個表單來寫一個新的評論,並將它發佈到評論控制器的創建操作。當您發佈表單時,也會發送相應書籍的ID,以便可以正確建立關係。如何將表單錯誤發送回它們來自哪裏?

在評論控制器中,我們嘗試保存評論。以下是我的控制器看起來像:

def create 
    @review = current_user.reviews.build(params[:review]) 
    @book = Book.find_by_ean params[:book] 
    @review.book = @book 

    if @review.save 
     redirect_to book_path(@book) 
    else 
     # In here I want to go back to book_path(@book), sending @review with it so that I can have access to @review.errors 
    end 
    end 

當然,當審查無法保存(審查內容爲強制性例如)我想回去的書展示頁面,並顯示形式,隨着錯誤給用戶。現在,據我可以工作了,這裏還有兩個可能性:

  1. 呈現「書籍/秀」,:回顧=> @review ---這不送回伴隨錯誤的審查(我想,不是100%),但URL保持爲「/ reviews」,導致大量問題。例如,我保存在「/ books」目錄中的部分內容無法找到。
  2. redirect_to book_path(@book)---這確實讓我回到正確的URL,但它不會發送@review,所以我不能顯示錯誤消息。

解決此問題的最佳方法是什麼?

回答

2

我通常通過將psot數據發送到原始控制器(在本例中爲書籍)中的成員動作而不是嵌套控制器來解決此問題。例如:

# routes.rb 
resources :books do 
    member do 
    post 'create_review' 
    end 
end 

,然後在視圖

# books/show.html.erb 
<%= form_for @new_review, :url => create_review_book_path(@book) do |f| %> 
... 
<% end %> 
在你的書控制器

最後

# books_controller.rb 
def create_review 
    @book = Book.find(params[:id]) 
    @new_review = @book.reviews.build(params[:review]) 
    if @new_review.save 
    @new_review = Review.new 
    end 
    render :action => :show 
end 

什麼情況是,表單被手動導向張貼它的數據我們的新成員路線在書籍控制器中。如果審覈成功保存,那麼我們會爲該變量分配一個新的審覈對象,以準備下一次審覈。如果它不成功,那麼@new_review變量將包含可以在表單中訪問的錯誤。

0

那麼,除非你序列化它,否則你不能通過get參數傳遞一個對象(使用重定向)。

我看到了這個問題的兩種解決方案。 1)在書本控制器 2保存評審)使窗體通過AJAX提交,並使用「渲染:更新」更新審查控制器形式

我不知道哪一個是最好的,這depents在項目規格像你可以使用Ajax?