Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

110
Vistas
Valor de paso de elixir durante la redirección

La función de inicio de sesión debe tomar la variable proporcionada por el usuario en el formulario y luego verificar si el usuario dado existe en la base de datos. En caso afirmativo, será redirigido al sitio principal, si no, será redirigido al mismo formulario para enviar nuevamente su nombre. tengo dos problemas

  1. Ambas funciones put_flash no funcionan.
  2. No sé cómo pasar valores adicionales desde el inicio de sesión (mientras que la redirección hay un valor de userp: userp, que no se proporciona en :main, y no en el renderizado en :main). ¿Cómo podría agregar estos argumentos adicionales? En este momento solo mantiene el nombre de usuario, pero más adelante quiero que maneje toda la especificación de usuario de la base de datos (está funcionando en este momento). A continuación se muestra el código

función de inicio de sesión:

 def login(conn, %{"user" => userp}) do changeSet = RewardappWeb.User.changeset(%RewardappWeb.User{}, userp) #IO.inspect(userp) users = Rewardapp.Repo.all(RewardappWeb.User) #IO.inspect(changeSet) #VALIDATION, IF GIVEN USER BELONGS TO DATABASE value = userp["user"] #map of lists listOfUsers = Rewardapp.Repo.all(RewardappWeb.User) IO.inspect(Enum.find(listOfUsers, fn x -> x.name == value end)) userSpec = Enum.find(listOfUsers, fn x -> x.name == value end) IO.inspect(userSpec) case userSpec do nil -> put_flash(conn, :error, "Could not find the user") #render(conn, "index.html", users: users, changeSet: changeSet) redirect(conn, to: Routes.grant_path(conn, :index), users: users, changeSet: changeSet) _ -> put_flash(conn, :info, "Logged in") #render(conn, "start.html", changeSet: changeSet, users: users, userp: userp) redirect(conn, to: Routes.grant_path(conn, :main), users: users, changeSet: changeSet, userp: userp) end end

función principal:

 def main(conn, params) do changeSet = RewardappWeb.User.changeset(%RewardappWeb.User{}, %{}) users = Rewardapp.Repo.all(RewardappWeb.User) render(conn, "start.html", changeSet: changeSet, users: users) end

función de índice:

 def index(conn, params) do changeSet = RewardappWeb.User.changeset(%RewardappWeb.User{}, %{}) render(conn, "index.html", changeSet: changeSet) end

el router.ex se ve así:

 get "/main", GrantController, :main get "/", GrantController, :index post "/users", GrantController, :login

Gracias de antemano por cualquier ayuda!!!

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Elixir es un lenguaje funcional. No puede mutar "clases" en su lugar y luego usarlas después de la mutación, ni nada por el estilo.

 case userSpec do nil -> put_flash(conn, :error, "Could not find the user") redirect(conn, to: Routes.grant_path(conn, :index), users: users, changeSet: changeSet) # ... end

Su put_flash(conn, ...) conn una conexión modificada y la arrojará al éter.

Luego, la llamada de redirect(conn, ...) modificará la conn original (la que no tiene flash, no la que tiene flash) y eso es lo que su función de inicio de sesión realmente termina devolviendo.

Es por eso que la redirección funciona, pero no hay plash: no se agregó a la conexión que está devolviendo.

Así que lo que quieres hacer es algo como

 case userSpec do nil -> conn |> put_flash(:error, "Could not find the user") |> redirect(to: Routes.grant_path(conn, :index), users: users, changeSet: changeSet) # ... end

Es decir, agrega el flash a la conexión, luego redirige el resultado, y eso es lo que su función debería devolver.

Espero que eso ayude.

En cuanto a agregar argumentos adicionales a la redirección, depende de lo que desee agregar. Si se trata de parámetros de consulta, entonces podría hacer

 path = Routes.grant_path(conn, :index, %{"foo" => "bar"}) redirect(conn, to: path)

La otra forma de agregar datos sería ponerlos en sesión.

Supongo que lo que realmente quiere es agregar datos que luego se usan en el html que está representando. La redirección no funciona de esa manera. Básicamente le dice al navegador, vaya a esta otra ubicación y realice el proceso de solicitud desde el principio.

En algunos casos, es posible que pueda representar una plantilla de vista diferente, en lugar de redirigir y lograr lo que desea.

 render(conn, "index.json", user: user, changeset: changeset)

Pero si eso es posible aquí realmente depende de su caso específico.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda