2017-10-09 3 views
1

je me suis déplacé du code à app.html.eex de poste/index.html.eexcode après passage de index.html.eex à app.html.eex: attribuer @user pas disponible dans le modèle EEX

<%= if @user do %> 
     <ul class="nav navbar-nav navbar-right"> 
      <li>Hello <%= @user.username %>!</li> 
      </ul> 
      <ul class="nav navbar-nav navbar-right"> 
    <li> <%= link "logout", to: session_path(@conn, :logout), method: :delete, class: "logout-button" %></li> 
     </ul> 
     </ul> 
     <% else %> 
       <ul class="nav navbar-nav navbar-right"> 
     <li ><a class="login" href="https://stackoverflow.com/users/signin">Login</a></li> 
     </ul> 
     <ul class="nav navbar-nav navbar-right"> 
     <li><a class="signup" href="https://stackoverflow.com/users/new">Signup</a></li> 
     </ul> 
     <% end %> 

Lorsqu'un utilisateur tente de se connecter, il soulève:

assign @user not available in eex template. 
Please make sure all proper assigns have been set. If this 
is a child template, ensure assigns are given explicitly by 
the parent template as they are not automatically forwarded. 
Available assigns: [:conn, :view_module, :view_template] 

Voici une partie du code du contrôleur utilisateur:

def index(conn, _params) do 
    users = Auths.list_users() 
    render(conn, "index.html", users: users) 
    end 

    def new(conn, _params) do 
    changeset = Auths.change_user(%Citybuilder.Auths.User{}) 
    render(conn, "new.html", changeset: changeset) 
    end 

    def create(conn, %{"user" => user_params}) do 
    case Auths.create_user(user_params) do 
     {:ok, user} -> 
     conn 
     |> put_flash(:info, "Welcome! Happy writing :)") 
     |> redirect(to: "https://stackoverflow.com/users/signin") 
     {:error, %Ecto.Changeset{} = changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

    def signin(conn, _params) do 
    render(conn, "signin.html") 
    end 

Je ne sais pas comment référencer spécifiquement app.html.eex du contrôleur.

J'ai regardé des questions similaires, mais n'a pas pu trouver une réponse:

assign @changeset not available in eex template

Je dois ajouter cessionnaires après "signin.html.eex", suivant le modèle conn, template, assigns.

def signin(conn, _params) do 
    render(conn, "signin.html") 
    end 

Répondre

1

Par <%= if @user %>, je suppose que vous voulez tester si cette variable est affectée par le contrôleur ou non. Dans ce cas, vous ne pouvez pas utiliser la syntaxe @ car elle déclenche une erreur si la variable n'est pas définie. Vous pouvez utiliser à la place la carte assigns (la carte qui contient toutes les liaisons) avec une syntaxe d'accès entre parenthèses.

Change:

<%= if @user do %> 

Pour:

<%= if user = assigns[:user] do %> 

Et puis, dans le code à l'intérieur du if, changer tous @user juste user.

+0

Merci, cela fonctionne. Clarifier; Le bloc de code vérifie si l'utilisateur est connecté. Si c'est le cas, il affiche un message de bienvenue et un bouton de déconnexion dans la barre de navigation. S'il n'y a pas d'ouverture de session, il ne propose que la connexion et l'inscription. – RubyRube