Railsのコントローラーで入力チェックを行う

Railsで作っててコントローラーで入力チェックをかけたい場合があります。


基本的に、「入力されたパラメータが適切か」ってのはモデルで管理したいです。そうです、MVCの基本です。
ただ入力されたパラメータが存在するかとか、Ajaxでのリクエストしか受け付けたくないとか、モデル以前にコントローラーで制限を加えたい場合ってあると思うのですよ!
そんなときの方法をご紹介します。


対象はRails2.3.x です。


通常だとコントローラーのアクションメソッドは以下のような感じになるかと思います。

class TopicsController < ApplicationController

  def index
    unless params[:category]
      flash[:notice] = "カテゴリーを選択してください"
      redirect_to :controller => "root"
      return
    end

    @topics = Topic.all(:category => params[:category])
  end
end

まぁできなくはないですが、ちょっとRubyっぽくないですね。
しかもこのチェックがほかのアクションでも必要になったら…?
プライベートメソッドに分けたとしても、ちょっといまいち感が漂ってきます。


こんな時にお勧めなのが verify メソッド。

class TopicsController < ApplicationController
  verify :params => :category, :redirect_to => {:controller => "root"},
    :add_flash => {:notice => "カテゴリーを選択してください"}

  def index
    @topics = Topic.all(:category => params[:category])
  end
end

これでかなりすっきりしますね!Railsっぽいですね!


verifyで使えるオプションは以下のとおりです。

オプション 説明
:params SymbolかArrayで必須パラメータのキーを指定
:session SymbolかArrayで必須のセッションのキーを指定
:flash SymbolかArrayで必須のフラッシュのキーを指定
:method :get、:post、:put、:deleteでリクエストメソッドを指定
:xhr Ajaxでのリクエストかどうかを指定
:add_flash 不正なリクエストとみなした際にフラッシュに追加するメッセージを指定
:add_headers 不正なリクエストとみなした際にレスポンスヘッダに追加する値を指定
:redirect_to 不正なリクエストとみなした際のリダイレクト先を指定
:render 不正なリクエストとみなした際のレンダー先を指定
:only verifyをかけるアクションメソッドを指定
:except verifyをかけないアクションメソッドを指定


ActionController::Verification(action_controller/verification.rb)で定義されています。

ただ、routes.rbでもコントローラーへの入力制限を行えるので、verifyをどこまで使うかは怪しいところです。


ちなみに、私は使ったことがありません。