【问题标题】:Display table data from RethinkDB in Phoenix Framework在 Phoenix Framework 中显示来自 RethinkDB 的表数据
【发布时间】:2015-10-07 09:16:49
【问题描述】:

我正在尝试在凤凰城的 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"}]}

显然,它正在从表中获取所有插入的 Carlos Santos 人员(我也必须阻止,但这不是我的主要问题),但在将它们检索到我的 Phoenix 项目时出错。

我有一个索引页,我在其控制器中创建表和数据。 然后我添加了一个新页面: 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 标签中?

【问题讨论】:

    标签: html elixir rethinkdb phoenix-framework


    【解决方案1】:

    这里的问题是@users 中的数据结构是%RethinkDB.Collection{} (source) 类型的,不能使用&lt;%=...%&gt; 输出

    您可能希望遍历用户以输出它们。比如:

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

    这里我们使用list comprehension 来迭代@users.data 数组中的所有项目。这是在 EEx 中输出一组元素(如用户、博文、cmets 等)的常用方式。

    您可能还想考虑将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 %>
    

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

    【讨论】:

    • @users.data 不是必需的。 RethinkDB.Collection 实现了 Enumerable,所以只需 for user &lt;- @users do 就可以了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2016-08-26
    • 2016-11-27
    • 2021-06-28
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多