Rails認証プラグインエラー
-
20-09-2019 - |
質問
私はそれを手に入れようとしています permit
を使用して作業する方法 レール認証プラグイン そして 本物の論理, 、そして私はこのエラーに遭遇し続けます:
試してみると:
class ApplicationController < ActionController::Base
...
before_filter permit 'admin'
...
これはわかります:
Authorization::CannotObtainUserObject in HomeController#index
Couldn't find #current_user or @user, and nothing appropriate found in hash
今、私は私のものを持っています current_user
メソッドをセットアップすると、アプリ内のほぼすべての場所でそれを使用したため、機能します。
class ApplicationController < ActionController::Base
...
helper_method :current_user
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
...
また、この方法が機能するため、データベース内に適切なロールを持つユーザーがいることもわかります。
def require_admin
unless current_user.is_admin? || current_user.is_root?
flash[:warning] = 'You are not an administrator and cannot access this page.'
redirect_to root_path
end
end
これを使用してユーザーレベルを確認するだけで、すべてを機能させることができます。
before_filter :require_admin, :only => 'index'
...しかし、同じことを効果的に行うことができるはずではありませんか permit
そして permit?
?
助けていただければ幸いです。さらにコードを確認する必要がある場合はお知らせください。喜んで投稿させていただきます。Google には、これら 2 つのシステムを相互に連携させることに関して、私が判断できる情報はまったくありません。
解決
さて、分かったと思います。
Jared が正しく指摘したように、適切な使用法は次のとおりです。
permit 'admin'
(の一部としてではありません) before_filter
).
しかし...
...デフォルト :get_user_method
に設定されています #current_user
, 、それが何ですか acts_as_authenticated
プラグインを使用します。前に述べたように、私は AuthLogic を使用しており、メソッドは次のように定義されています。 current_user
(シャープ記号なし)。
そこで、次のことを試してみました。
permit 'admin', :get_user_method => current_user
そのような変数やメソッドが存在しないことを説明する素晴らしいエラー メッセージが表示されるだけです。ただし、私が見逃していたのは、ハッシュ オプションが 弦, 、メソッドへの直接呼び出しではありません!!(愚かな間違い、私は知っています!)
それで
permit 'admin', :get_user_method => 'current_user'
...私にとってはうまくいくようです。
私は Ruby と Rails が大好きですが、そのシンプルさが災いしてしまうこともあります。私はいつもシンプルなものに夢中になります。:)
他のヒント
あなたは間違ってプラグインを使用しています。これは、前のフィルタには設置しないでください。
グローバルレベルでは、あなたは、単に宣言します:
permit 'admin'
それはそれだ。
あなたの行動のすべては、CURRENT_USERまたは@userオブジェクトを探し、ない場合は、ログインページにリダイレクトされます。
ごとの行動レベルでは、あなたがブロックとしてそれを使用します:
def index
permit 'admin' do
@some_models = SomeModel.all
end
end