2012/09/09

[rails] before_filterに引数をとるメソッドを指定する。

Railsで、before_filterに引数を取るメソッドを指定したい場合があります。
例えば、複数のコントローラで、あるクエリパラメータを使用したフィルタを適用したい、 という場合で、クエリパラメータの名前が違う、といったケースが該当すると思います。

具体的には、次のような場合です。

 GET /hoge?uid=:uid
 GET /users/:id
uidをユーザーIDとした場合、上記のURIはともにユーザーIDをパラメータとして期待しています。 前者はparams[:uid]に、後者はparams[:id]にユーザーIDが入る、ということです。

ユーザーIDを使って、何らかのフィルタをかけるとなった時、フィルタメソッドは、

  def some_filter(user_id)
    # do something..
  end
みたいに書けます。
このメソッドをbefore_filterに指定するにはどうするか、というのがこのエントリの趣旨ですが、 簡単なことでした。
↓を参考にします。
http://stackoverflow.com/questions/5507026/before-filter-with-parameters

先ほどの、GET /hoge?uid=:uid のコントローラに対しては、

class HogeController < ApplicationController

  before_filter { |c| some_filter(params[:uid]) }

  :

  # GET /hoge?uid=:uid
  def index
  end

  :
end
と書くことができ、一方 GET /users/:id のコントローラに対しては、
class UsersController < ApplicationController

  before_filter { |c| some_filter(params[:id]) }

  :

  # GET /users/:id
  def show
  end

  :
end
と書けます。

0 件のコメント: