【问题标题】:After moving code from index.html.eex to app.html.eex: assign @user not available in eex template将代码从 index.html.eex 移动到 app.html.eex 后:分配 @user 在 eex 模板中不可用
【发布时间】:2018-03-20 23:04:48
【问题描述】:

我将一些代码从 post/index.html.eex 移至 app.html.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="/users/signin">Login</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
      <li><a class="signup" href="/users/new">Signup</a></li>
      </ul>
      <% end %>

当用户尝试登录时,它会引发:

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: "/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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

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

    变化:

    <%= if @user do %>
    

    收件人:

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

    然后,在if 内的代码中,将所有@user 更改为仅user

    【讨论】:

    • 谢谢,这行得通。澄清;代码块检查用户是否登录。如果是,它会在导航栏中打印一条欢迎消息和注销按钮。如果没有登录,它只提供登录和注册。
    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2020-09-19
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多