es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Phoenix Live View, estoy obteniendo ** (ArgumentError) se proporcionó nil para `token` al intentar acceder a @current_user para un usuario no registrado.

El error que obtengo es:

** (ArgumentError) se proporcionó nil para `token`. La comparación con nil está prohibida, ya que no es seguro. En su lugar, escriba una consulta con is_nil/1, por ejemplo: is_nil(s.token)

Estoy tratando de crear una lógica para mostrar cosas para visitantes vs usuarios iniciados sesión.

Para los usuarios iniciados sesión, puedo usar @current_user.email, etc. en mis plantillas, pero no para los visitantes (personas que no han iniciado sesión)

Entonces, tengo esto en mi página en vivo home_page_live.ex:

def mount(_params, session, socket) do
  socket =
    socket
    |> assign(:welcome_message, "Hola, visitante!")
    |> assign_current_user(session)

  {:ok, socket}
end

y la función assign_current_user() está en mi live_helpers.ex:

def assign_current_user(socket, session) do
  assign_new(
    socket,
    :current_user,
    fn ->
      Accounts.get_user_by_session_token(session["user_token"])
    end
  )
end

¿Alguna idea de cómo puedo incorporar la función is_nil(), que me sugiere el mensaje de error, para que funcione no solo para los usuarios iniciados sesión, sino también para los usuarios no iniciados sesión en mi página de inicio? De modo que pueda hacer algo como:

<%= if @current_user do %>
  <%= @current_user.email %>
<% else %>
  ¡Hola, usuario sin iniciar sesión!
<% end %>

Actualmente, mi suposición es que el current_user es nil y no un mapa, por lo que termina todo y Phoenix se bloquea por alguna razón interna de Phoenix. Pero no tengo idea de cómo hacer que funcione.

¿Sabes qué hacer para que funcione tanto para los usuarios iniciados sesión como para los usuarios no iniciados sesión?

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el parámetro token pasado es nulo y es inseguro compararlo con nil. La sugerencia es usar is_nil() en lugar de una comparación directa con nil.

    Para incorporar la función is_nil() y hacer que funcione tanto para usuarios conectados como no conectados, puedes modificar la función assign_current_user() para manejar el caso cuando el token de sesión no está presente o es nulo. Aquí tienes un ejemplo:

    def assign_current_user(socket, session) do
      assign_new(
        socket,
        :current_user,
        fn ->
          case session["user_token"] do
            nil -> nil
            token ->
              user = Accounts.get_user_by_session_token(token)
              if is_nil(user), do: nil, else: user
          end
        end
      )
    end
    

    Este código primero verifica si el user_token en la sesión es nil. Si es nil, entonces devuelve nil (ya que el usuario no está conectado). De lo contrario, obtiene el usuario mediante el token y verifica si el usuario es nil (lo que significa que el token es inválido). Si el usuario es nil, entonces devuelve nil. De lo contrario, devuelve el mapa del usuario.

    Con esta modificación, tu código de plantilla debería funcionar tanto para usuarios conectados como no conectados.

Comments are closed.