0

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

items / 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とそれはエラーをレンダリングします

4

1 に答える 1

1

リダイレクトすると、エラーメッセージが失われます。オブジェクトが有効でなく、保存されない場合は、リダイレクトするのではなく、ビューをレンダリングする必要があります。rails3でrespond_withメソッドを使用してこれを行う最善の方法はまだわかりませんが、rails3が生成するscaffoldingを見ると、失敗した保存の処理がどのように機能するかがわかります。

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
于 2010-10-24T18:30:36.357 に答える