Sooey

2014-11-19 17:17:21 +0900

Rails 4.0でrespond_to利用時にUnknownFormatが発生しないようにする方法。

コントローラーのアクションが以下のようなコードになっている場合、

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html
      format.xml  { render xml: @user }
      format.json { render json: @user }
    end
  end
end

/users/1.textのようなパスにリクエストがあるとActionController::UnknownFormatが発生する。

通常はその挙動のままで構わないと思うが、要件によっては「不明なフォーマットが指定された場合はすべてtext/htmlを返したい」ということもありうる。そのような場合は、formatanyメソッドを使うことでデフォルトの挙動を指定することができる。

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.any
      format.xml  { render xml: @user }
      format.json { render json: @user }
    end
  end
end

anyメソッドは、any(:xml, :json)のように受け入れるフォーマットを引数で指定することもできる。

format.any(:xml, :json) { render request.format.to_sym => @user }

また、anyメソッドにはallというエイリアスも設定されているので、format.allという指定でもよい。

参考: