2014-02-19 21 views
0

我這個問題真的很尷尬:形式的Rails 4.0

我要發佈從一個視圖的意見和如果發生形式的錯誤,我想重新填充表單。我使用渲染方法,但我的表單沒有重新填充。

予指定的形式從一個視圖中顯示,並使用另一控制器動作,通過換言之是指:

形式從稱爲:視圖/汽車/ show.html.erb以下代碼:

<h1>Fiche détaillée</h1> 

<%= @car.marque %><br> 
<%= @car.modele %><br> 
<%= @car.nbkm %><br> 
<%= @car.couleur %><br> 
<%= @car.disponibilite %><br> 
<hr> 

<% x=0 %> 
<h1><%= pluralize(@car.comments.count, 'commentaire') %></h1> 
<% @car.comments.each do |k| %> 
<%= x+=1 %> 
Email : <%= k.email %><br> 
Sujet : <%= k.sujet %><br> 
Commentaire : <%= k.commentaire %><br> 
<%= link_to 'Supprimer', [k.car, k], method: :delete %><br><br> 
<% end %> 

<hr> 

<h1>Ajouter votre commentaire</h1> 
<div style='width:300px;'> 

<% flash.each do |key, msg| %> 
<% if msg.count >0 %> 
<p class="bg-danger" style='padding:10px;'><%= pluralize(msg.count,'error') %> 
    <ul><% msg.full_messages.each do |m|%> 
     <li><%= m %></li> 
    <% end %> 
</p> 
<% end %> 
<% end %> 
</ul> 




<%= form_for([@car,@car.comments.build]) do |co| %> 

<%= co.label :'Email' %><br> 
<%= co.text_field :email , class: 'form-control' %><br> 
<br> 
<%= co.label :'Sujet' %><br> 
<%= co.text_field :sujet , class: 'form-control'%><br> 
<br> 
<%= co.label :'Commentaire' %><br> 
<%= co.text_area :commentaire , class: 'form-control' %><br> 
<br> 
<%= co.submit :'Envoyer votre commentaire', class: 'btn btn-info'%> 

<% end %> 
</div> 

低於我控制器:

控制器1:控制器/ cars_controller.rb

def create 
#render text: params[:car].inspect 
@car = Car.new(params[:car].permit(:marque,:modele,:nbkm,:couleur,:disponibilite)) 
    if [email protected] 
    render 'new' 
    else 
    redirect_to @car 
    end 
end 

def show 
@car = Car.find(params[:id]) 
end 

def index 
@cars=Car.all 
end 

控制器2:控制器/ comments_controller.rb

class CommentsController < ApplicationController 

    def new 
    @comment=Comment.new 
    end 

    def create 

    @car = Car.find(params[:car_id]) 
    @comment = @car.comments.create(params[:comment].permit(:email,:sujet,:commentaire)) 

     if [email protected] 


      flash[:error] = @comment.errors 
      flash.keep[:error] 
      render 'cars/show' 

      else 
      redirect_to car_path(@car) 
     end 
    end 


    def destroy 
    @car = Car.find(params[:car_id]) 
    @comment = @car.comments.find(params[:id]) 
    @comment.destroy 
    redirect_to car_path(@car) 
    end 

end 

我真的不明白爲什麼這是行不通的!

非常感謝你的任何援助;)

+0

你的代碼看起來軌道的建議非常不同。你可以試試'rails g scaffold name fields ...'看看我的意思? – devanand

+0

對不起,但我想了解我的代碼最初怎麼了,以瞭解如何導軌工作 – CodeRevenger

回答

0

編輯:

我做了一些類似的測試了一下你的情況下,該問題應該是由於flash方法。

替換以下行:

flash[:error] = @comment.errors 
flash.keep[:error] 
render 'cars/show' 

要:

flash.now[:error] = @comment.errors.full_messages 
@car.reload 
render 'cars/show' 

因爲flash[:error]只會在接下來的動作獲得,意味着只能在redirect_to,所以你必須使用flash.now[:error]呈現相同的看法模板。而最重要的是,雖然保存失敗@comment的,在@car評論列表仍然會收到由註釋的createbuild,或new方法的實例無效的對象回報。這是因爲這三種方法將實例化的對象隨時返回@car.comments集,雖然它沒能挽救它。因此,我們必須通過@car.reload重裝@car對象刷新內存,並從數據庫中獲取正確的評論集。


上回應:

在箱子的動作,create方法@car.comments.create(..)將直接創建並沒有給出屬性返回一個實例化對象,然後試圖挽救它,如果它通過了驗證。如果您還沒有設置Comment型號的驗證,那麼它將直接保存它。嘗試@car.comments.new(..)@car.comments.build(..)收藏協會,它不會強制保存一個實例化的對象驗證通過後。另外,請檢查您的Comment型號設置驗證。

+0

謝謝你的回覆,但它不工作... – CodeRevenger

+0

已編輯,請檢查它。祝你好運! –

+0

感謝您的幫助,它的工作原理,但我不明白的是爲什麼當我到達我的展示頁面時,我還有一行空的。意思是如果我有3條評論,我有另一個空的顯示!我使用views/cars/show.html.erb – CodeRevenger