ムカデノワラジ

ムカデノワラジ

ガジェット・Webサービス・プログラミング・エンタメについて書く雑記ブログ

MENU

Rails プロジェクトでDeviseが原因のエラーを回避する

この記事ではRuby on Rails のプロジェクトで認証機能を提供するgem deviseを使ったときにおこるエラーと、それをbefore_actionなどのメソッドを使って回避する 方法を紹介する。

目次

・Deviseについて

・deviseでよく起こるエラー

・before_action・after_actionなどのメソッドの使いかた

Deviseについて

DeviseはRailsプロジェクトに簡単に安全な認証を追加できる便利なgemだが、もともと備わっている機能をカスタマイズしたりするのが難しく、エラーが出た時に嵌りやすい。

 

deviseでよく起こるエラー

Deviseを使っていてエラーによく出会うのは、ページ遷移を伴うイベントを処理するときだ。

ページの読み込み時やリダイレクト時に発火するJavaScriptや、メソッドを定義しているとしばしばDeviseのせいでエラーが起こる。

例:gon を使ってjavaScriptに渡すデータをコントローラ内で定義した場合

 

gonを使うとコントローラ側で

# gon.ooo のoooは任意
def index
gon.data1 = 'hoge'
gon.data2 ='foo'
gon.xxx = 'bar'
end

と定義した値をJavaScriptから次のように取得できる。

var data1 =gon.data1; 
// =>'hoge' 
var data2 = gon.data2;
//=>'foo'
var data3 =gon.xxx
//=> 'bar'

gonの値をコントローラで定義しているページから、deviseのregistration_controllerでユーザー情報をupdateするのに失敗したとき(例えばpasswordが間違っていて元のページにリダイレクトされたとき)、gonで定義したデータが未定義になって取得できない場合がある。

updateが成功した場合は次のような流れになる

update成功 => リダイレクトしてget =>もとのページに戻る。(=> この時、gon が定義される)

before_action・after_actionなどのメソッドの使いかた

Rails ではbefore_action, after_action, around_actionを使うことで定義したアクションの前や後、途中に別の操作を割り込ませることができる。

before_action, around_actionはそれぞれactionの前後だが、around_actionではyieldで指定した場所で別の操作を実行できる。

before_action: :method_name #=> すべてのaction 前にmethod1を実行する

def method_name
  #=> define  something to do
end
after_action: :method #=> すべてのactionの後にmethod2を実行する
around_action : :method #=> action内のyield でmethod3を実行
#e.g.
def update
  do something
  yield #=> ここでaround_action で指定した操作が実行される
end

before_action, after_actionはデフォルトですべてのアクションの前に実行されるが実際に使うときはある特定のシチュエーションに限定する場合が多い。
その場合、次のようにする。

before_action: :method_name, only: [:action1, :action2, .....]

only で指定したアクションの前だけ指定したメソッドを実行する。
only以外にexceptを使って例外の場合だけを使うこともできる。

before_actionより前に操作を割り込ませたい場合は、prepend_before_actionを同様に使う。
after_actionより前に操作を割り込ませたい場合は、prepend_after_actionを使う。

これらのprepend_before_actionやprepend_after_actionをdeviseが影響を与えるactionに対して使うとdeviseが原因のエラーを回避できることがある