Railsアプリケーションでは、アプリケーションコントローラに2つのメソッドがあります。そのうちの1つはユーザーを認証します(ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインするようにリダイレクトします)。他方はそのタスクの前半を実行する(すなわち、ユーザがログインしているかどうかをチェックする)。論理的に同一の2つのメソッドが同じタスクを実行しないのはなぜですか?
チェックが完了すると、ユーザーがログインしている場合、これらの方法はいずれも、User.find
を使用して、現在サインインしているユーザーのユーザーオブジェクトに@current_user
変数を設定します。
は旧:
protected
def authenticate_user
if session[:user_id]
# set current user object to @current_user object variable
@current_user = User.find session[:user_id]
return true
else
flash[:notice] = "You must log in first."
flash[:color] = "invalid"
redirect_to(:controller => 'sessions', :action => 'login')
return false
end
end
後者:あなたが見ることができるように
def check_login_status
if session[:user_id]
@current_user = User.find session[:user_id]
return true
end
end
、これらの各方法の前半のためのロジックは同じです。ただし、authenticate_user
は、@current_user
変数を正しく設定します。レイアウトファイルにチェックを@current_user.nil? == true
言う、のようにcheck_login_status
は(すべてでそれを設定していない
を。これは、レイアウトファイルの関連部分です。
<% if not @current_user.nil? %>
Logged in as <%= @current_user.username %> —
<a href="/logout">log out</a> —
<a href="/dashboard">dashboard</a> —
<a href="/contacts">contacts</a> —
<a href="/help">help</a>
<% if @current_user.is_admin %>
— <a href="/admin">admin</a>
<% end %>
<% else %>
<a href="/login">log in</a> —
<a href="/sign-up">sign up</a> —
<a href="/help">help</a>
<% end %>
私が示されたリンクの第2のセットを取得します、私がログアウトしていたことを示す。
それでは、なぜ後者が正しく@current_user
変数を設定していないのですか?それは(どういうわけか、私はそれを疑うが)マーキングprotected
を行うには何も持っていますか?
後者のメソッドは実際に呼び出されていますか?多分、問題はルートにあり、コントローラではない。 –
@ das-gはい、私は両方とも 'before_filter'呼び出しで使用しました。 – ArtOfCode