在 Phoenix Framework 中显示来自 RethinkDB 的 table 数据
Display table data from RethinkDB in Phoenix Framework
我正在尝试在凤凰城的 RethinkDB 中显示我的数据库中的数据(使用来自 Hamiltop https://github.com/hamiltop/rethinkdb-elixir 的 rethinkdb-elixir 包)。我对两者都比较陌生,但我已经设法将两个 table 和一些数据插入到那些 table 中。我知道这是因为我通过 RethinkDB 的 Web GUI 检查了它。
现在我想在项目的 html 页面中显示 table 数据。
我已将错误减少到一个:
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"}]}
很明显,它正在从 table 获取所有插入的 Carlos Santos 人员(我也必须阻止,但这不是我的主要问题)但是在将它们检索到我的 Phoenix 项目时出错。
我有一个索引页,我在其控制器中创建了 tables 和数据。
然后我添加了一个新页面:
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 标签中?
这里的问题是你在@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 %>
如果您不打算使用地图中的许多字段,这将非常有用。
我正在尝试在凤凰城的 RethinkDB 中显示我的数据库中的数据(使用来自 Hamiltop https://github.com/hamiltop/rethinkdb-elixir 的 rethinkdb-elixir 包)。我对两者都比较陌生,但我已经设法将两个 table 和一些数据插入到那些 table 中。我知道这是因为我通过 RethinkDB 的 Web GUI 检查了它。
现在我想在项目的 html 页面中显示 table 数据。 我已将错误减少到一个:
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"}]}
很明显,它正在从 table 获取所有插入的 Carlos Santos 人员(我也必须阻止,但这不是我的主要问题)但是在将它们检索到我的 Phoenix 项目时出错。
我有一个索引页,我在其控制器中创建了 tables 和数据。 然后我添加了一个新页面: 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 标签中?
这里的问题是你在@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 %>
如果您不打算使用地图中的许多字段,这将非常有用。