在 eex 模板中显示来自 Phoenix 控制器的查询数据
Show queried data from Phoenix controller in eex template
我在 Phoenix 控制器中有一个查询,它获取学生列表,并且对于列表中的每一行,在其 id 上与血型进行连接并获取血型名称。我想在我生成的 eex 模板中显示它,但出现错误。
这是学生架构:
schema "students" do
field :firstname, :string
field :lastname, :string
field :birthday, Ecto.Date
field :joined_on, Ecto.Date
field :bloodgroup_id, :integer
timestamps()
end
这是血型模型:
schema "bloodgroups" do
field :name, :string
timestamps()
end
我正在这样获取控制器中的数据:
def query do
query = from s in Student,
join: b in BloodGroup, on: s.bloodgroup_id == b.id,
select: [s.firstname, s.lastname, s.birthday, s.joined_on, s.bloodgroup_id, b.name]
end
def index(conn, _params) do
students = Repo.all(query)
render(conn, "index.html", student_info: students)
end
并在模板中显示如下:
<%= for student <- @student_info do %>
<tr>
<td><%= Enum.fetch(student, 0) %></td>
<td><%= student[:lastname] %></td>
<td><%= student[:birthday] %></td>
<td><%= student[:joined_on] %></td>
<td><%= student[:name] %></td>
<td class="text-right">
<%= link "Show", to: student_path(@conn, :show, student), class: "btn btn-default btn-xs" %>
<%= link "Edit", to: student_path(@conn, :edit, student), class: "btn btn-default btn-xs" %>
<%= link "Delete", to: student_path(@conn, :delete, student), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>
</td>
</tr>
<% end %>
但是使用形式 Enum.fetch
和 student[:firstname]
不起作用并抛出 Argument error
或 protocol Phoenix.HTML.Safe not implemented
我想在模板中显示从控制器发送的内容,但遇到了这些错误。有一个更好的方法吗?我是 Phoenix 和 Elixir 的新手。
根据您发布的查询,您应该会得到包含 Repo.all
的列表列表。您可以使用模式匹配来提取数据,例如:
<%= for [firstname, lastname, birthday, joined_on, bloodgroup_id, name] <- @student_info do %>
但是,这不是惯用语。你真的应该在这里使用 Ecto 的关系。
添加 BloodGroup
作为与 Student
的 belongs_to
关系:
schema "students" do
...
belongs_to :bloodgroup, BloodGroup, foreign_key: :bloodgroup_id
end
然后这样查询:
students = Repo.all(Student) |> Repo.preload(:bloodgroup)
那么您的模板就变成了:
<%= for student <- @student_info do %>
<tr>
<td><%= student.lastname %></td>
<td><%= student.birthday %></td>
<td><%= student.joined_on %></td>
<td><%= student.bloodgroup.name %></td>
<td class="text-right">
<%= link "Show", to: student_path(@conn, :show, student), class: "btn btn-default btn-xs" %>
<%= link "Edit", to: student_path(@conn, :edit, student), class: "btn btn-default btn-xs" %>
<%= link "Delete", to: student_path(@conn, :delete, student), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>
</td>
</tr>
<% end %>
所有代码都未经测试。如果这不起作用,请告诉我。这可能是某处打字错误。
我在 Phoenix 控制器中有一个查询,它获取学生列表,并且对于列表中的每一行,在其 id 上与血型进行连接并获取血型名称。我想在我生成的 eex 模板中显示它,但出现错误。
这是学生架构:
schema "students" do
field :firstname, :string
field :lastname, :string
field :birthday, Ecto.Date
field :joined_on, Ecto.Date
field :bloodgroup_id, :integer
timestamps()
end
这是血型模型:
schema "bloodgroups" do
field :name, :string
timestamps()
end
我正在这样获取控制器中的数据:
def query do
query = from s in Student,
join: b in BloodGroup, on: s.bloodgroup_id == b.id,
select: [s.firstname, s.lastname, s.birthday, s.joined_on, s.bloodgroup_id, b.name]
end
def index(conn, _params) do
students = Repo.all(query)
render(conn, "index.html", student_info: students)
end
并在模板中显示如下:
<%= for student <- @student_info do %>
<tr>
<td><%= Enum.fetch(student, 0) %></td>
<td><%= student[:lastname] %></td>
<td><%= student[:birthday] %></td>
<td><%= student[:joined_on] %></td>
<td><%= student[:name] %></td>
<td class="text-right">
<%= link "Show", to: student_path(@conn, :show, student), class: "btn btn-default btn-xs" %>
<%= link "Edit", to: student_path(@conn, :edit, student), class: "btn btn-default btn-xs" %>
<%= link "Delete", to: student_path(@conn, :delete, student), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>
</td>
</tr>
<% end %>
但是使用形式 Enum.fetch
和 student[:firstname]
不起作用并抛出 Argument error
或 protocol Phoenix.HTML.Safe not implemented
我想在模板中显示从控制器发送的内容,但遇到了这些错误。有一个更好的方法吗?我是 Phoenix 和 Elixir 的新手。
根据您发布的查询,您应该会得到包含 Repo.all
的列表列表。您可以使用模式匹配来提取数据,例如:
<%= for [firstname, lastname, birthday, joined_on, bloodgroup_id, name] <- @student_info do %>
但是,这不是惯用语。你真的应该在这里使用 Ecto 的关系。
添加 BloodGroup
作为与 Student
的 belongs_to
关系:
schema "students" do
...
belongs_to :bloodgroup, BloodGroup, foreign_key: :bloodgroup_id
end
然后这样查询:
students = Repo.all(Student) |> Repo.preload(:bloodgroup)
那么您的模板就变成了:
<%= for student <- @student_info do %>
<tr>
<td><%= student.lastname %></td>
<td><%= student.birthday %></td>
<td><%= student.joined_on %></td>
<td><%= student.bloodgroup.name %></td>
<td class="text-right">
<%= link "Show", to: student_path(@conn, :show, student), class: "btn btn-default btn-xs" %>
<%= link "Edit", to: student_path(@conn, :edit, student), class: "btn btn-default btn-xs" %>
<%= link "Delete", to: student_path(@conn, :delete, student), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>
</td>
</tr>
<% end %>
所有代码都未经测试。如果这不起作用,请告诉我。这可能是某处打字错误。