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をどこまで使うかは怪しいところです。
ちなみに、私は使ったことがありません。