1

通常、Rails コントローラーの Update アクションには、次のようなコードがあります。

def update
  @book = Book.find(params[:id])
  if @book.update_attributes(params[:book])
    redirect_to(@book)
  else
    render :edit
  end
end

それ以外の場合、これは編集テンプレートをレンダリングします。しかし、次のように、編集アクションとまったく同じ方法で、respond_to を使用したい場合はどうなるでしょうか。

def update
  @book = Book.find(params[:id])
  if @book.update_attributes(params[:book])
    redirect_to(@book)
  else
    respond_to do |format|
      format.html  # edit.html.erb
      format.json  { render :json => @team }
    end
  end
end

そのため、更新が失敗した場合は、要求された形式に応じて json または html が返されていることを確認してください。それは理にかなっていますか?その場合、次のエラーを回避するにはどうすればよいでしょうか: 「このアクションでレンダリングおよび/またはリダイレクトが複数回呼び出されました」

4

1 に答える 1

3

私には理にかなっています。答えは単純で、 の直後returnですredirect_to

def update
  @book = Book.find(params[:id])
  if @book.update_attributes(params[:book])
    redirect_to(@book)
    return
  else
    respond_to do |format|
      format.html  # edit.html.erb
      format.json  { render :json => @team }
    end
  end
end

複数回レンダリングする方法が正確にはわかりませんが、そうであると仮定すると、returnリダイレクト後にそれ以上のレンダリングの処理を停止するように RAILS に指示する必要があります。after_filterそれが本当なら、どこかから干渉している可能性があります。

于 2013-04-08T13:33:54.047 に答える