2017-09-10 3 views
1

Lassen Sie uns sagen, ich habe dieses Modell in einer App Phoenix.Zugriff auf fremde Beziehung Feld durch Vorlage

defmodule Rumbl.Video do 
    use Rumbl.Web, :model 

    schema "videos" do 
    field :url, :string 
    field :title, :string 
    field :description, :string 
    belongs_to :user, Rumbl.User 
    belongs_to :category, Rumbl.Category 

    timestamps() 
    end 

    @required_fields ~w(url title description) 
    @optional_fields ~w(category_id) 

    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 

end 

Und das Kategoriefeld repräsentiert zu einem Kategorie-Modell eine Beziehung, die einen Feldnamen genannt hat.

Dann in der Vorlage Ich habe dies:

<%= for video <- @videos do %> 
    <tr> 
     <td><%= video.user_id %></td> 
     <td><%= video.url %></td> 
     <td><%= video.title %></td> 
     <td><%= video.description %></td> 
     <td><%= video.category_id %></td> 

     <td class="text-right"> 
     <%= link "Show", to: video_path(@conn, :show, video), class: "btn btn-default btn-xs" %> 
     <%= link "Edit", to: video_path(@conn, :edit, video), class: "btn btn-default btn-xs" %> 
     <%= link "Delete", to: video_path(@conn, :delete, video), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %> 
     </td> 
    </tr> 
<% end %> 

Wie Sie sehen können, ich video.category_id

Wie zugreifen kann ich video.category.name zugreifen es menschlichere lesbar zu machen?

Edit: Video-Controller-Index und Kategorien Teil

defmodule Rumbl.VideoController do 
    use Rumbl.Web, :controller 

    alias Rumbl.Video 

    def action(conn, _) do 
    apply(__MODULE__, action_name(conn), 
      [conn, conn.params, conn.assigns.current_user]) 
    end 

    def index(conn, _params, user) do 
    videos = Repo.all(user_videos(user)) |> Repo.preload(:category) 
    render(conn, "index.html", videos: videos) 
    end 

    alias Rumbl.Category 

    plug :load_categories when action in [:new, :create, :edit, :update] 

    defp load_categories(conn, _) do 
    query = 
     Category 
     |> Category.alphabetical 
     |> Category.names_and_ids 
    categories = Repo.all query 
    assign(conn, :categories, categories) 
    end 
end 
+0

stellen Sie sicher, dass Sie Relation vorladen, und danach können Sie über 'video.category.name' zugreifen. Sehen Sie sich diesen Artikel an - https://robots.thoughtbot.com/preloading-nested-associations-with-ecto – Avdept

Antwort

5

Ich gehe davon aus Sie die Videos wie diese in Ihrem Controller sind geladen:

videos = Repo.all(Video) 

Dies wird nicht die zugehörigen Datensätze laden. Dafür können Sie Repo.preload verwenden:

videos = Repo.all(Video) |> Repo.preload(:category) 

Jetzt wird jedes Video ihre category Feld mit all ihren Feldern geladen und Sie können <%= video.category.name %> in der Vorlage zu tun.

+0

Ich habe das Pre-Load zur Pipe hinzugefügt: videos = Repo.all (user_videos (user)) |> Repo. preload (: category), aber es beschwert sich Funktion nil.name/0 ist undefined oder private bei <% = video.category.name%> – lapinkoira

+0

Ich habe in der Frage Teil meines video_controller Code – lapinkoira

+0

hinzugefügt Sieht aus wie dieser bestimmte Benutzer nicht habe eine 'category' zugewiesen (' category_id' wäre auch null). Nicht sicher, was Sie in diesem Fall tun möchten, aber für diesen Fall nichts ausgeben, können Sie tun <% = if category = video.category, do: category.name%> '. – Dogbert

Verwandte Themen