我正在创建一个基本的博客应用程序,当用户尝试提交空白评论时,我遇到了显示错误消息的问题。而不是获得漂亮的错误消息,与正确的验证erorrs的活动记录错误消息。如
ActiveRecord::RecordInvalid in CommentsController#create
Validation failed: Name can't be blank, Email can't be blank
在我的文章/节目视图中,我有以下代码:
<%= form_for([@article, @article.comments.build]) do |f| %>
<%= render "shared/error_messages", :target => @article %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :body %><br />
<%= f.text_area :body %>
</div>
<p><%= f.submit %></p>
<% end %>
我的错误消息部分如下所示:
<% if target.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(target.errors.count, "error") %> prohibited this record from being saved:</h2>
<ul>
<% target.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
我知道答案很简单,但我无法理解。
在评论控制器中创建操作:
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html { redirect_to(@article, :notice => 'Comment was successfully created.') }
format.xml { render :xml => @article, :status => :created, :location => @article }
else
format.html { render :action => "articles/show" }
format.xml { render :xml => @comment.errors, :status => :unprocessable_entity }
end
end
答案 0 :(得分:4)
我有类似的问题。一切似乎都很好,但我没有得到任何错误 我找到的解决方案是在文章#show而不是视图中构建注释:
@article = Article.find(params[:id])
@comment = @article.comments.build(params[:comment])
在你的文章#show中不要使用@ article.comments.build而是@comment:
<%= form_for([@article, @comment]) do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<p><%= f.submit %></p>
<% end %>
确保你在评论中创建评论#create(你真的别无选择:P)
另外,我不知道它是否重要(我对ruby很新),但我认为你需要传递f.object而不是@comment。
答案 1 :(得分:2)
我想你是说你得到了一个灰白色的大错误页面,对吗?
检查回溯,但我怀疑这是来自控制器中的create
操作,而不是视图。
如果您的控制器在末尾使用save!
并使用!
,则表示如果记录无效,则会引发错误。另一方面,save
返回true或false,并允许您使用简单的分支逻辑来决定如何做出反应。
如果我对save!
的预感不正确,请发布控制器代码,以便我们可以深入挖掘:)谢谢!
答案 2 :(得分:1)
解决方案是将注释创建的操作指向正确的控制器/操作,并在我的错误消息部分中定位@comment。
最终观点
<%= form_for([@article, @article.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 :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :body %><br />
<%= f.text_area :body %>
</div>
<p><%= f.submit %></p>
<% end %>
评论控制器中的最终创建操作
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html { redirect_to(@article, :notice => 'Comment was successfully created.') }
format.xml { render :xml => @article, :status => :created, :location => @article }
else
format.html { render :action => "articles/show" }
format.xml { render :xml => @comment.errors, :status => :unprocessable_entity }
end
end