ruby-on-rails-3 - tutorial - rubygems
Dónde anular el método de ayuda de usuario actual para diseñar la gema (4)
De acuerdo con el módulo Devise::Controllers::Helpers , current_user
(junto con todos los otros dispositivos de ayuda) se agrega a ApplicationController, lo que significa que puede anularlo de esta manera:
# 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
¿Cómo puedo anular current_user of idear gem? De hecho, necesito agregar servicios web para aplicaciones móviles.
Actualmente, el diseño es la gestión de la sesión y ''current_user'' para la aplicación web.
Ahora la aplicación móvil enviará user_id al servidor. Necesito anular al usuario actual como este
def current_user
if params[:user_id].blank?
current_user
else
User.find(params[:user_id])
end
end
¿Debo modificar la gema como un complemento? o algo mas ?
Por favor explique en detalle ya que soy nuevo en los rieles.
Saludos cordiales,
La otra respuesta que sugiere aliasing el método en realidad no es la mejor solución. El comentario de Doug English es la mejor solución:
# In ApplicationHelper
def devise_current_user
@devise_current_user ||= warden.authenticate(:scope => :user)
end
Esta es la razón:
Supongamos que está incluyendo su ApplicationHelper en su controlador. Si necesita un método en su ApplicationHelper que se base en devise_current_user, dada la solución de alias dentro del controlador, no tiene suerte.
Pero con la definición de método explícito anterior, puede mover la definición a la ayuda y llamarla desde otros métodos y aún así puede incluirla en el controlador.
Esto es útil, por ejemplo, cuando está desarrollando una solución de suplantación de usuario y necesita mostrar dos usuarios diferentes en la vista, uno para el administrador real (devise_current_user) y el otro, el usuario suplantado (usuario_actual).
La respuesta de Limbo-Peng es excelente, pero se puede mejorar un poco para asegurarse de que solo los administradores puedan hacer esto:
¿Necesitarás también definir un is_admin?
método o atributo is_admin
en la clase de usuario.
También es posible que desee utilizar una clave diferente de user_id
, por lo que nunca entrará en conflicto con sus parámetros habituales.
# 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
Suponiendo que podemos confiar en los datos de nuestra sesión (que depende de si usted ingresa los datos del usuario sin la debida autorización o no), esto podría funcionar como una preocupación:
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
Estoy usando esto en un proyecto por ahora.
Una pregunta menor (en la respuesta, lo siento) ... ¿debería saber si hay algún cambio en Devise o Warden que haga que devise_current_user
desactualizado?