Ruby on rails 从其他控制器Rails 4.0进行错误验证后重新填充表单

Ruby on rails 从其他控制器Rails 4.0进行错误验证后重新填充表单,ruby-on-rails,Ruby On Rails,我对这个问题感到非常尴尬: 我想从一个视图发表评论,如果表单中出现错误,我想重新填充表单。我使用render方法,但我的表单没有重新填充 我指定从视图中显示表单,并使用另一个控制器操作,换句话说就是: 从以下代码调用的表单:views/cars/show.html.erb: <h1>Fiche détaillée</h1> <%= @car.marque %><br> <%= @car.modele %><br> <

我对这个问题感到非常尴尬:

我想从一个视图发表评论,如果表单中出现错误,我想重新填充表单。我使用render方法,但我的表单没有重新填充

我指定从视图中显示表单,并使用另一个控制器操作,换句话说就是:

从以下代码调用的表单:views/cars/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>
控制器2:控制器/注释\u Controller.rb

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

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

def index
@cars=Car.all
end
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 !@comment.save


          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
class CommentsController
我真的不明白为什么它不起作用

非常感谢您的帮助;)

编辑:

我为您的案例做了一些类似的测试,问题应该是由于
flash
方法造成的

替换以下行:

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

由于
flash[:error]
仅在下一个操作中可用,因此只能在
redirect\u to
中使用,因此您必须使用
flash.now[:error]
来呈现相同的视图模板。最重要的是,尽管
@comment
的保存失败,
@car
中的注释列表仍然会收到注释的
create
build
new
方法返回的实例化无效对象。这是因为这三个方法总是将实例化的对象返回到
@car.comments
集合,尽管它无法保存它。因此,我们必须通过
@car.reload
重新加载
@car
对象,以刷新内存并从数据库中获取正确的注释集合


以前的答复:


在板条箱操作中,
create
方法
@car.comments.create(..)
将直接创建并返回一个没有给定属性的实例化对象,然后在通过验证后尝试保存它。如果您没有为
Comment
model设置验证,那么它将直接保存它。请尝试
@car.comments.new(..)
@car.comments.build(..)
对于集合关联,验证通过后将不会强制保存实例化对象。另外,检查您的
注释
模型以设置验证。

您的代码与rails的建议非常不同。您可以尝试
rails g scaffold name fields…
了解我的意思吗?对不起,我想先了解我的代码有什么问题,然后了解rails是如何工作的感谢您的帮助,它是如何工作的,但我不明白的是,当我到达我的显示页面时,为什么还有一行空的。意思是如果我有3条评论,我会显示另一条空评论!!我使用views/cars/show.html.erb
@Precode
,您是说您试图创建4条注释,但1条未保存,其余3条保存在db中?然后你到达
show
页面,得到1个空评论行和3个填充评论?不,我的意思是当我转到show页面时,它会自动列出一个空评论,而且我认为这是因为评论。新方法
flash.now[:error] = @comment.errors.full_messages
@car.reload
render 'cars/show'