どのようにオーバーライドできますか 現在の使用者 の 宝石を工夫する。 実際、モバイルアプリ用のウェブサービスを追加する必要があります。
現在deviseはセッションとWebアプリケーションの 'current_user'を管理しています。
これで、モバイルアプリはuser_idをサーバーに送信します。このように現在のユーザーを上書きする必要があります
def current_user
if params[:user_id].blank?
current_user
else
User.find(params[:user_id])
end
end
Devge gemをプラグインとして変更する必要がありますか?または、他の何か ?
Railsを初めて使用するので、親切に詳しく説明してください。
敬具、
モジュールによると Devise :: Controllers :: Helpers 、current_user
(他のすべてのデバイスヘルパーとともに)がApplicationControllerに追加されます。つまり、次のようにオーバーライドできます。
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
if params[:user_id].blank?
devise_current_user
else
User.find(params[:user_id])
end
end
メソッドのエイリアスを提案する他の答えは、実際には最善の解決策ではありません。 Doug Englishのコメントが最善の解決策です。
# In ApplicationHelper
def devise_current_user
@devise_current_user ||= warden.authenticate(:scope => :user)
end
その理由は次のとおりです。
コントローラーにApplicationHelperを含めているとします。コントローラー内のエイリアスソリューションを考えると、devise_current_userに依存するApplicationHelperのメソッドが必要な場合は、運が悪いです。
しかし、上記の明示的なメソッド定義を使用すると、定義をヘルパーに移動して他のメソッドから呼び出すことができ、それでもコントローラーに含めることができます。
これは、たとえば、ユーザーの偽装ソリューションを開発していて、ビューに2人の異なるユーザーを表示する必要がある場合に便利です。1つは実際の管理者(devise_current_user)で、もう1つは偽装ユーザー(current_user)です。
セッションデータを信頼できると仮定すると(適切な承認なしにユーザー入力をそこに入れるかどうかに依存します)、これは懸念事項として機能する可能性があります。
module Concerns
module ControllerWithImpersonation
extend ActiveSupport::Concern
included do
helper_method :devise_current_user
end
def current_user
if session[:impersonated_user_id].blank?
devise_current_user
else
User.find(session[:impersonated_user_id])
end
end
def devise_current_user
@devise_current_user ||= warden.authenticate(:scope => :user)
end
end
end
今のところ、これをプロジェクトで使用しています。
マイナーな質問(答えは申し訳ありませんが)... devise_current_user
上記は古くなっていますか?
Limbo-Pengの答えは素晴らしいですが、管理者だけがこれを実行できるように少し改善することができます:
また、Userクラスでis_admin?
メソッドまたはis_admin
属性を定義する必要があります。
user_id
とは異なるキーを使用することもできます。これにより、通常のパラメータと競合することはありません。
# to impersonate another user, e.g. for customer support
# only admins can do this..
#
alias_method :devise_current_user, :current_user
def current_user
if ! params[:user_id].blank? \
&& devise_current_user && devise_current_user.is_admin?
User.find(params[:user_id])
else
devise_current_user
end
end