发生错误时如何在嵌套模型中填充表单?
Posted
技术标签:
【中文标题】发生错误时如何在嵌套模型中填充表单?【英文标题】:How to populate form in nested model when error occurs? 【发布时间】:2012-02-19 21:16:03 【问题描述】:运行 Rails 3.2.1。
我浏览了 Ruby on Rails 网站上的“入门”指南。我已经建立了一个博客帖子,有人可以对帖子发表评论。
我修改了示例以在我输入未验证的 cmets(无名称或注释文本)时显示错误。
(一个帖子有多个cmets等)
但是,我如何让 Rails 将这个有问题的评论放回表单而不是页面?
这是我在 cmets 控制器中的创建方法:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html redirect_to(@post, :notice => 'Comment was successfully created.')
else
format.html render 'posts/show'
end
end
结束
这是我来自帖子的 show.html.erb:
<%= render @post %>
<h3>Comments</h3>
<%= render @post.comments %>
<h3>Add a comment</h3>
<%= render "comments/form" %>
<p>
<% if user_signed_in? %>
<%= link_to 'Edit', edit_post_path(@post) %> |
<% end %>
<%= link_to 'Back', posts_path %>
</p>
这是我的部分评论表单:
<%= form_for([@post, @post.comments.build]) do |f| %>
<%= render "shared/error_messages", :target => @comment %>
<div class="field">
<%= f.label "Name" %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :body %><br />
<%= f.text_area :body %>
</div>
<div class="actions">
<%= f.submit "Add Comment!" %>
</div>
<% end %>
这是我的部分评论:
<p>
<strong><%= comment.name %></strong><br />
<%= comment.created_at.try(:strftime, "on %A, %B %d %Y at %H:%M:%S") %><br />
<%= simple_format(h(comment.body), :sanitize => true) %>
</p>
【问题讨论】:
请添加您的 show.html.erb 【参考方案1】:当您从错误中返回时,在您的表单中。
<% if @comment.errors.any? %>
<div id="errorExplanation">
<h2><%= pluralize(@comment.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
【讨论】:
同样的错误:显示 /home/dave/cms/app/views/cmets/_form.html.erb 其中第 2 行引发:nil:NilClass 提取源的未定义方法“错误”(大约行#2): 1: 2: 3: 4:禁止保存此帖子:
5: 模板包含的痕迹:app/views/posts/show.html.erb以上是关于发生错误时如何在嵌套模型中填充表单?的主要内容,如果未能解决你的问题,请参考以下文章
发生验证错误后,如何使用 PrimeFaces AJAX 填充文本字段?
如何使用 jQuery 重新填充表单提交时隐藏的 CSV 字段