显示Phoenix Framework中RethinkDB的表数据

时间:2015-07-17 15:31:05

标签: html elixir rethinkdb phoenix-framework

我试图在凤凰城的RethinkDB中使用来自Hamiltop https://github.com/hamiltop/rethinkdb-elixir的rethinkdb-elixir包)的数据库显示数据。我对这两者都比较新,但我已经设法在这些表中插入两个表和一些数据。我知道这是因为我通过RethinkDB的Web GUI进行了检查。

现在我想在项目的html页面中显示表数据。 我把错误减少到一个:

protocol Phoenix.HTML.Safe not implemented for %RethinkDB.Collection{data: [%{"first_name" => "Carlos", "id" => "4be8adc3-0973-45dc-bdb8-7a4dac6528d5", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "c84658fc-e4a4-4cb6-8107-b011ca996abd", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "c09fe081-379a-4334-97a3-31c5503c8c61", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "cf0c0ad3-3152-40f0-b613-5b051a314b51", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "ca28a714-ed54-4ebd-8707-d53170ead0f7", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "1ea77c0f-538c-4663-be92-499f16996594", "last_name" => "Santos"}, %{"first_name" => "Carlos", "id" => "1ea74846-0860-4ae5-95f5-674860cf7fc6", "last_name" => "Santos"}]}

显然,这是从桌子上取下所有插入的卡洛斯·桑托斯人(我也必须阻止,但这不是我的主要问题),但是在将我们的凤凰项目检索到它时出错了。

我在其控制器中创建了一个索引页面,我创建了表格和数据。 然后我添加了一个新页面: 的 router.ex

get "/users", UsersController, :users

/views/users_view.ex

defmodule RethinkExample.UsersView do
  use RethinkExample.Web, :view
end

users.html.eex

<div class="jumbotron">
  <p><%= @users %>!</p>
</div>

users_controller.ex

defmodule RethinkExample.UsersController do
  use RethinkExample.Web, :controller
  use RethinkDB.Query

    def users(conn, _params) do
        q = table("users")
            |> filter(%{last_name: "Santos"})
            |> RethinkExample.Database.run
        |> IO.inspect
        render conn, "users.html", users: q
    end

我推断html代码也不正确,因为这是我在html标签内显示路由特定id的方式。 如何成功获取数据然后将其显示在html标记中?

1 个答案:

答案 0 :(得分:2)

此处的问题是@users中的数据结构属于%RethinkDB.Collection{}source)类型,无法使用<%=...%>输出

您可能希望迭代用户输出它们。类似的东西:

<%= for user <- @users.data do %>
  <p><%= "#{user["first_name"]} #{user["last_name"]}" %>!</p>
<% end %>

这里我们使用list comprehension来迭代@users.data数组上的所有项目。这是在EEx中输出元素数组(例如用户,博客帖子,评论等)的常用方法。

您可能还想考虑将q.data传递为@users而不是q,以防止必须@users.data

另外,您还可以在列表解析中使用模式匹配:

<%= for %{"first_name" => first_name, "last_name" => last_name} <- @users.data do %>
  <p><%= "#{first_name} #{last_name}" %>!</p>
<% end %>

如果您不打算使用地图中的许多字段,这将非常有用。