Elixir如何从ecto获取地图

时间:2018-04-07 21:28:00

标签: elixir phoenix-framework ecto

我想从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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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功能的可用性有关。

希望有所帮助!