2016-09-19 6 views
0

Ich habe eine Abfrage in einem Phoenix-Controller, der eine Liste von Studenten erhält, und für jede Zeile in der Liste ein Join mit der Blutgruppe auf seiner ID und erhält die Blutgruppe Name. Ich möchte das in einer EEX-Vorlage anzeigen, die ich generierte, aber Fehler erhalte.Angefragte Daten von Phoenix Controller in EEX-Vorlage anzeigen

Hier ist das Studenten Schema:

schema "students" do 
    field :firstname, :string 
    field :lastname, :string 
    field :birthday, Ecto.Date 
    field :joined_on, Ecto.Date 
    field :bloodgroup_id, :integer 

    timestamps() 
end 

Hier ist die Blutgruppe Modell:

schema "bloodgroups" do 
    field :name, :string 
    timestamps() 
end 

ich die Daten in der Steuerung wie so bekommen:

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 

und Anzeigen in die Vorlage wie folgt:

<%= 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 %> 

Aber das mit dem Formular Enum.fetch und student[:firstname] funktionieren nicht und werfen entweder Argument error oder protocol Phoenix.HTML.Safe not implemented

möchte ich zeigen, was von der Steuerung in der Vorlage gesendet wurde, aber diese Fehler am schlägt. Gibt es einen besseren Weg, dies zu tun? Ich bin neu in Phoenix und Elixier.

Antwort

3

Basierend auf der Abfrage, die Sie gepostet haben, sollten Sie eine Liste von Listen mit Repo.all zurückbekommen. Sie können den Musterabgleich verwenden, um die Daten zu extrahieren, so etwas wie:

<%= for [firstname, lastname, birthday, joined_on, bloodgroup_id, name] <- @student_info do %> 

ABER, das ist nicht idiomatisch. Du solltest Ectos Beziehungen hier wirklich benutzen.

hinzufügen BloodGroup als belongs_to Bezug auf Student:

schema "students" do 
    ... 
    belongs_to :bloodgroup, BloodGroup, foreign_key: :bloodgroup_id 
end 

dann wie folgt die Abfrage tun:

students = Repo.all(Student) |> Repo.preload(:bloodgroup) 

Dann einfach Ihre Vorlage wird:

<%= 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 %> 

Alle Code ist ungetestet. Bitte lassen Sie mich wissen, wenn das nicht funktioniert. Es ist wahrscheinlich irgendwo ein Tippfehler.

+0

Vielen Dank! Ich ging den idiomatischen Weg und nutzte die Beziehung, die viel einfacher war. Obwohl ich einen Fehler mit dem obigen 'gehört_to' habe. Nach einigen Recherchen habe ich folgendes verwendet und es funktionierte: 'gehört zu: Blutgruppe, Blutgruppe, Fremdschlüssel:: Blutgruppe_ID' – Destroid

+0

@Destroid danke! Ich habe die Antwort behoben. – Dogbert

Verwandte Themen