2013-10-13 24 views
6

私はEventsコントローラを持っていますが、イベントが公開されている場合は認証をスキップします。条件付きでskip_before_filterを適用します:if =>条件をレールで指定します。

ApplicationControllerでは、私はのauthenticate_user!

class ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
end 

を考案するには、このコールは今、私のイベントテーブルの中に、私はpublicと呼ばれるブール値フィールドを持っています。私はイベントが公開されているかどうかを確認するためにそれを使用します。このようにEventsController

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show, if: Proc.new { :is_public? } 
end 

しかし、何らかの理由でこれが機能しませんでした。私はこれをしなければならなかった。期待し、上記スキップした後の逆の状態とbefore_filterを繰り返しているため@event.public = true場合は認証をスキップとして

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show 
    before_action :authenticate_user!, unless: :is_public? 

    def is_public? 
    @event.present? && @event.is_public 
    end 
end 

これは動作します。

私は疑問に思って:私がやったこと

  1. が正しいのですか?
  2. パフォーマンスへの影響はありますか。はいの場合は、良い方法がありますか?
+1

...起こっているので、多くのbefore_action事がある理由を理解することはかなり難しいということでしょうか? 'Proc.new {:is_public}' – Damien

+0

Nopes。私は実際にこの ':if => conditonal'を動作させることができませんでしたので、それが':is_pulic? 'か':is_public'であるかどうかは分かりません – CuriousMind

+0

'public'フィールドがある場合、 「公衆」または「公的? 'is_public?'メソッドを 'Event'モデルに移動します。 – Damien

答えて

6

コールバック(before、after、aroundアクション)に関するレールのドキュメントは実際にはかなり悪いです。このような質問を参照してください:skip_before_filter ignores conditionals

私は常にレールガイドを参照してください。あなたにとって興味深い部分はここにあります:http://guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters

これはスキップフィルタでもうまくいくとは確信していませんが、試してみる価値があります。

異なるフィルタを呼び出すだけでは、パフォーマンスに影響はありません。パフォーマンスの問題は通常、広範なデータベースクエリまたは他の外部システムコールによって発生します。

私の主な関心事は、ここにあなたが意図的に疑問符を忘れた、2番目のコードブロックで

関連する問題