0

Rails アプリケーションがあり、アプリケーション コントローラーには次のコードがあります。

redirect_to :login unless @current_user = User.find_by_uid(session[:cas_user])
@current_user.syncUserRoles

したがって、これは、ユーザー アカウントが正常に見つからない限り、ログインするようにリダイレクトすることになっています。ただし、@current_user が nil を返しても、次の行に進んでいました。そのため、コードを次のように変更しました。

@current_user = User.find_by_uid(session[:cas_user])
redirect_to :login unless @current_user.present?
@current_user.syncUserRoles

ただし、2 行目でないとインラインを無視し、3 行目で nilClass エラーが発生してエラーが発生します。最終的に本格的な if else ステートメントに頼らなければなりませんでしたが、何が間違っていたのか知​​りたいです。

if @current_user.present?
    @current_user.syncUserRoles
else
    redirect_to :login
end //This works as intended
4

2 に答える 2

2

redirect_to は、メソッド内のコード実行を停止しません。return を呼び出して、コードの実行を確実に停止します。

(redirect_to :login && return) unless @current_user = User.find_by_uid(session[:cas_user])

このように機能しますか?

于 2012-08-06T16:33:56.273 に答える
1

ここでの混乱は、redirect_to動作ではなく、動作にありunlessます。ヘッダーをredirect_to設定するだけで、アクションから戻ることはありません。302 Movedしたがって、次の行は引き続き実行され(あなたの@current_user.syncUserRoles行)、レンダリングされると、302ステータスコードが設定されます。

elseあなたが発見したように、それを唯一のブランチに置くことは、その行の実行を回避する1つの方法です。

于 2012-08-06T16:35:34.020 に答える