rails3 respond_with

原创文章,转载请注明来源并保留原文链接

rails3有个新的controller跳转方法叫respond_with,rails总是不忘自己的哲学-“不要重复自己”,在rails2.x的版本中,下面的写法比较常见:

class PostsController < ApplicationController::Base

  def index
    @posts = Post.all
    respond_to do |format|
      format.html
      format.xml { render :xml => @posts.to_xml }
      format.json { render :json => @posts.to_json }
    end
  end

  def create
    @post = Post.create(params[:post])
    respond_to do |format|
      format.html { redirect_to posts_url }
      format.xml { render :xml => @post.to_xml }
      format.json { render :json => @post.to_json }
    end
  end
end

又臭又长,有了respond_with,就变成如下了:

class PostsController < ApplicationController::Base

  respond_to :html, :xml, :json

  def index
    respond_with(@posts = Post.all)
  end

  def create
    @post = Post.create(params[:post])
    respond_with(@post)
  end
end

多清爽啊,respond_with会根据请求的类型,自动的返回html,xml,或者json。当然了,respond_with也可以override来调整到需要的。
1)status,head

  respond_with(@posts = Post.all, :status => 200, :head => :ok)

2)override

respond_with(@posts) do |format|
    format.html { redirect_to posts_url }
end

3)any,匹配任意的格式

respond_with(@posts) do |format|
    format.any(:xml, :json) { redirect_to posts_url }
end

4):location,类似上面的2

respond_with(@posts, :location => posts_url)

2 thoughts on “rails3 respond_with

  1. 看好感觉respond_with 这个方法的确很帅,奇怪的是rails new 创建工程时还是用respond_to,有点遗憾呀

    • rails的scaffold一直都是沿用的老的respond_to方法,这是为了方便初学者理解,毕竟respond_with还是比较含蓄的。

Leave a Reply

Your email address will not be published. Required fields are marked *