2017-10-09 37 views
1

我有些感动代码后/ index.html.eex从index.html.eex移动代码app.html.eex后:分配@user不具备的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 %> 
到app.html.eex

当用户试图登录,它提出:

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] 

下面是从用户控制器的代码的一部分:

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 

我不确定如何从控制器专门引用app.html.eex。

我看着类似的问题,但无法找到一个答案:

assign @changeset not available in eex template

我需要“signin.html.eex”后添加受让人,继conn, template, assigns模式。

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

回答

1

<%= if @user %>,我假设你想测试这个变量是否由控制器分配。在这种情况下,如果变量未设置,则不能使用@语法,因为它会引发错误。您可以改为使用括号访问语法的assigns映射(包含所有绑定的映射)。

变化:

<%= if @user do %> 

要:

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

,然后在if里面的代码,所有@user改变只是user

+0

谢谢,这是有效的。澄清;代码块检查用户是否登录。如果是,它将打印一条欢迎消息,并在导航栏中注销按钮。如果没有登录,它只提供登录和注册。 – RubyRube