【问题标题】:Phoenix: value is not retrieved in viewPhoenix:视图中未检索到值
【发布时间】:2017-12-06 13:46:49
【问题描述】:

我想在模板中获得团队价值。 我无法获得团队价值。查询没问题。 错误信息是吹的。

在 GET /members/new 时出现 ArgumentError 分配 @teams 在 eex 模板中不可用。 请确保已设置所有正确的分配。如果这 是一个子模板,确保分配由明确给出 父模板,因为它们不会自动转发。

有什么事吗?

member_controller.ex

  def new(conn, _params) do
    changeset = Member.changeset(%Member{})
    teams = Repo.all(Team)
    assign(conn, :teams, teams)
    render(conn, "new.html", changeset: changeset)
  end

form.html.eex

<%= @teams %>

【问题讨论】:

  • conn = assign(conn, :teams, teams)?
  • 1) 见@Dogbert 的评论。 2) 要获取/使用模板中的团队,请执行以下操作:@conn.assigns[:teams] 没有额外的@teams 变量。为此,您需要像使用渲染函数中的变更集变量 (teams: teams) 一样将其放入模板。从您的模板到您的部分执行相同的操作 (teams: @teams)。

标签: elixir phoenix-framework


【解决方案1】:

我觉得上面的代码可以修改为

def new(conn, _params) do
  changeset = Member.changeset(%Member{})
  teams = Repo.all(Team)
  render("new.html", changeset: changeset, teams: teams)
end

【讨论】:

    【解决方案2】:

    Elixir 是一种不可变的语言。当您执行assign(conn, :teams, team) 时,conn 本身不会被修改,而是返回一个新的、更新的。 解决办法是:

    def new(conn, _params) do
      changeset = Member.changeset(%Member{})
      teams = Repo.all(Team)
      conn = assign(conn, :teams, teams)
      render(conn, "new.html", changeset: changeset)
    end
    

    这可以通过使用管道操作符进一步清理:

    def new(conn, _params) do
      changeset = Member.changeset(%Member{})
      teams = Repo.all(Team)
      conn
      |> assign(:teams, teams)
      |> render("new.html", changeset: changeset)
    end
    

    【讨论】:

    • 我明白你告诉我的。但它还没有工作。我有不同的错误吗?错误“分配 @teams 在 eex 模板中不可用。”发生。
    • form.html.eex 中似乎没有“@teams”。如何将“@teams”作为参数提供给 form.html.eex 模板?
    • 如果你渲染一个局部,你需要在render调用中传递所有的赋值,所以可能类似于render("form.html", teams: @teams)
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2014-08-23
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多