2014-02-19 20 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