usuarios tutorial rails hacer español como ruby-on-rails-3 authentication ruby-on-rails-3.1 rubygems devise

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?