在Rails應用程序中,我的應用程序控制器中有兩種方法。其中一個用戶對用戶進行身份驗證(即檢查用戶是否已登錄,如果沒有,則將其重定向到登錄)。另一個執行該任務的前半部分(即,檢查用戶是否登錄)。爲什麼邏輯上相同的兩種方法不執行相同的任務?
檢查完成後,如果用戶已登錄,則這兩種方法都假定通過使用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
變量; check_login_status
不設置它在所有(如,在佈局文件的檢查報告說@current_user.nil? == true
這是佈局文件的相關部分:
<% 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 %>
我得到所示的第二組鏈接,這說明我退出。
那麼,爲什麼後者未正確設置@current_user
變量?它有什麼用protected
標記(雖然我有點懷疑)?
後面的方法實際上被稱爲?也許問題出在路線上,而不是控制器。 –
@ das-g是的,我用'before_filter'調用了它們。 – ArtOfCode