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
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 endfunció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) endfunción de índice:
def index(conn, params) do changeSet = RewardappWeb.User.changeset(%RewardappWeb.User{}, %{}) render(conn, "index.html", changeSet: changeSet) endel router.ex se ve así:
get "/main", GrantController, :main get "/", GrantController, :index post "/users", GrantController, :loginGracias de antemano por cualquier ayuda!!!
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) # ... endEs 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.