发生错误时如何在嵌套模型中填充表单?

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

以上是关于发生错误时如何在嵌套模型中填充表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Extjs 4 中使用嵌套的 JSON 填充表单

发生验证错误后,如何使用 PrimeFaces AJAX 填充文本字段?

如何在rails中禁用嵌套表单的服务器端验证

如何使用 jQuery 重新填充表单提交时隐藏的 CSV 字段

对象需要,得到ActiveSupport :: HashWithIndifferentAccess嵌套表单

导轨中的三重嵌套模型形式显示错误