Rails 3 - 嵌套资源上的错误验证

时间:2010-10-24 15:11:56

标签: ruby-on-rails nested-resources

我真的在如何处理Rails 3中的错误处理方面苦苦挣扎。我已经破解了一些可行的想法,但宁愿以正确的方式去做。如果有人可以提供帮助或给予指导,我将不胜感激。这是我到目前为止所拥有的

ItemController

def show
    @item = Item.find(params[:id])
    @note = @item.notes.new
    respond_with(@item)
  end

NoteController

def create
    @note = @item.notes.build(params[:note])
    flash[:notice] = 'Your note was successfully added!' if @note.save
    respond_with(@item)
  end

项/ show.html.erb

<%= form_for ([@item, @note]),  :html => {:id => 'form-add-item-note'} do |f| %>

我试过了

<%=f.error_messages%> 
<%=error_messages_for :note%>
<%=error_messages_for :item,:note%> 

甚至有一个处理错误的模板

    <%= render "global/error_messages", :target => @item %>

包含

<% 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 %>

我相信我正在丢失重定向的错误,但我似乎无法完全了解如何从注释创建中的失败保存重定向或呈现项目控制器,我希望能够传递错误全局模板@note并呈现错误

1 个答案:

答案 0 :(得分:1)

如果您重定向,则会丢失任何错误消息。如果对象无效且无法保存,则需要呈现视图,而不是重定向。我不确定使用respond_with方法在rails3中执行此操作的最佳方法,但是如果您查看scaffolding rails3生成,您会看到处理失败的保存工作方式。

respond_to do |format|
  if @post.save
    format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
    format.xml  { render :xml => @post, :status => :created, :location => @post }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
  end
end