【问题标题】:Elixir how to get map from ectoElixir如何从ecto获取地图
【发布时间】:2018-04-08 13:51:52
【问题描述】:

我想从 ecto 获得一个数据结构,它允许在我的 HTML 中迭代地编写类似这样的内容:

<%= genders.name %>

所以我想我应该有:

[{name: "Male", id: 1}, {name: "Female", id: 2}]

现在我的控制器运行良好

defmodule HexProjectWeb.LandingController do
  use HexProjectWeb, :controller

  alias HexProject.Gender

  def index(conn, _params) do
    genders = HexProject.Repo.all(Gender) |> Enum.map(&{&1.name, &1.id})

    conn
    |> assign(:genders, genders)
    |> render("index.html")
    #render conn, "index.html", genders: genders
  end
end

但它会返回这样的性别:

[{Male, 1}, {Female, 2}]

我不知道如何展示这个。

所以我尝试了

genders = HexProject.Repo.all(
  from g in Gender,
  select: %{name: g.name, id: g.id}
)

它返回一个错误

函数 HexProjectWeb.LandingController.init/1 未定义(模块 HexProjectWeb.LandingController 不可用)

编辑:完全错误

error rendering view

edit2: router.ex

defmodule HexProjectWeb.Router do
  use HexProjectWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", HexProjectWeb do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/landing", LandingController, :index
    resources "/genders", LandingController
  end

  # Other scopes may use custom stacks.
  # scope "/api", HexProjectWeb do
  #   pipe_through :api
  # end
end

感谢您的帮助。

【问题讨论】:

  • 您的第二次尝试是正确的。该错误看起来与此更改无关。你能发布完整的错误信息吗?
  • 我截图并编辑了我的帖子。这是你问的?
  • 您在哪个文件中定义了HexProjectWeb.LandingController 模块?从该错误看来,您在路由器中使用了此模块名称,但 Elixir 找不到该模块。
  • 是的,我在 router.ex 中定义了它。帖子已编辑。

标签: elixir phoenix-framework ecto


【解决方案1】:

您可以单独解决这些问题。

对于您的第一种方法,您应该:

genders = HexProject.Repo.all(Gender) |> Enum.map(&%{name: &1.name, id: &1.id})

对于第二种方法,您在控制器中构建查询,您应该在文件顶部添加导入,但在控制器定义中,例如:

defmodule HexProjectWeb.LandingController do
  use HexProjectWeb, :controller

  import Ecto.Query # add this line

  alias HexProject.Gender

在您的第一次尝试中,您实际上是在构建一个元组,应将其替换为正确的映射语法(%{} 而不是{})。

不幸的是,您遇到的第二个问题与您使用宏有关,实际上它与您的控制器中缺少from 函数的可用性有关。

希望有帮助!

【讨论】:

  • 我不确定 OP 是如何得到“模块不可用”错误的,因为他们在模块中使用了宏?
  • 谢谢,这两种解决方案都能完美运行。还有一个问题。如果要显示大量元素,我应该选择哪种解决方案?是可以忽略不计还是其中一种解决方案在处理大量数据时具有更好的性能?
  • @Dogbert 我同意 - 我主要是根据我的个人经验分享这个并且失去了无数的 分钟,通常这个相当神秘和不相关的错误消息是由于缺乏这个特定的导入。
  • @Gotrek 恐怕我无法立即为您提供准确的答案,通常您需要某种基准测试来双重确认假设,但如果我的直觉是精心设计的查询(因此,第二种方法),但我不确定这是最好的方法。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多