2017-05-03 3 views
2

Cette question est tellement fondamentale que je n'arrive pas à trouver les détails en ligne.Afficher le dernier enregistrement dans la base de données en utilisant Phoenix/Ecto

J'ai un modèle appelé 'radios' et je souhaite afficher la dernière la radio a ajouté à ma page d'accueil - templates/page/index.html.eex

Ce que j'ai jusqu'à présent:

radio.ex

defmodule Radios.Radio do 
    use Radios.Web, :model 
    import Ecto.Query 

    schema "radios" do 
    field :name, :string 
    field :desc, :string 
    field :price, :integer 
    field :text1, :string 
    field :text2, :string 
    field :text3, :string 
    field :text4, :string 
    field :mainimg, :string 

    timestamps() 
    end 

    @doc """ 
    Builds a changeset based on the `struct` and `params`. 
    """ 
    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:name, :desc, :price, :text1, :text2, :text3, :text4, :mainimg]) 
    |> validate_required([:name, :desc, :price, :text1, :text2, :mainimg]) 
    end 

    def sorted(query) do 
    from r in query, 
    order_by: [desc: r.inserted_at] 
    end 

end 

page_controller.ex

defmodule Radios.PageController do 
    use Radios.Web, :controller 

    alias Radios.Radio 


    def index(conn, _params) do 
    last_radio = Radio 
    |> Radio.sorted 
    |> Radios.Repo.one 
    render(conn, "index.html", radio: radio) 

    end 
end 

Page Template

<p class="title is-4"><%= @last_radio.name %></p>

Je suppose que je devrais écrire la requête dans le contrôleur de la page et non le contrôleur radio?

Tout cela se traduit par l'erreur de la console suivante:

== Compilation error on file web/controllers/page_controller.ex == 
** (CompileError) web/controllers/page_controller.ex:11: undefined function radio/0 

Ceci est probablement soooo de base, et imaginez que je manque quelque chose de très simple, mais quoi !?

Répondre

5
def index(conn, _params) do 
    last_radio = Radio 
    |> Radio.sorted 
    |> Radios.Repo.one 
    render(conn, "index.html", radio: radio) 
end 

Vous assignez le résultat de votre requête à last_radio, mais vous essayez d'utiliser la radio variable lorsque vous attribuez dans votre rendu. Je crois que vous voudrez

render(conn, "index.html", last_radio: last_radio) 

à la place.

+0

Vous avez raison. Cela a fonctionné! Et si je crée d'autres requêtes, puis-je continuer à les ajouter dans ce tableau de rendu? –

+1

Oui. 'render (conn," index.html ", last_radio: last_radio, toto: toto, bar: barre)'. Vous pouvez attribuer autant de valeurs que vous le souhaitez. –

+0

Super, merci @justinwood. –