6

アプリケーションで before_filter を使用しています。logged_in?ユーザーがログインしている場合に true を返すメソッドがあります。

def logged_in?
  !!current_user
end

def current_user
  @current_user = (User.find(session[:user_id]) if session[:user_id]) || false
end

現在、ユーザーコントローラーで、ユーザーがログインしていない場合にのみアクションを実行する必要があります。このために、メソッドでnot条件を次のように使用します。logged_in?before_filter

before_filter :!(logged_in?)

しかし、これは私にエラーを与えます。ログインしていないための新しいメソッドを作成することに抵抗しています。

これを達成するための正しい構文を理解するのを手伝ってください。

4

3 に答える 3

18

受け入れられた答えはうまくいくように見えますが、私は別のやり方をしていたでしょう。

before_filter :login_required, unless: :logged_in?

def login_required
  redirect_to login_path, notice: 'Please login'
end

これにより、ユーザーがまだログインしていない限り、login_required メソッドが実行されます。詳細については、http://robots.thoughtbot.com/post/159805303/before-filter-wisdomを参照してください。

于 2012-09-03T18:04:05.450 に答える
8

ブロックを次の場所に渡すことができますbefore_filter:

before_filter { |c| !c.logged_in? }

しかし、 before フィルターからの戻り値はどこにも行かないので、これは実際には何もしません。ユーザーがログインしていない場合にアクションを実行する場合は、そのアクションを before_filter に入れる必要があります。

たとえば、アクションがログイン ページのパスにリダイレクトすることであった場合、次のようにすることができます。

before_filter { |c| redirect_to login_path unless c.logged_in? }

それは実際には、独自のメソッドを正当化するのに十分な長さです:

before_filter :login_required

def login_required
  redirect_to login_path unless logged_in?
end
于 2012-09-03T13:14:12.003 に答える
0

application_controller.rb

before_filter :authorize

def current_user
   @current_user ||= User.find_by(id: session[:user_id])
end
   helper_method :current_user

protected
def authorize
   unless User.find_by(id: session[:user_id])
     redirect_to login_url, :notice => "Not Authorize Member"
   end
end
于 2016-01-14T13:30:21.317 に答える