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