отображать другие данные в рубрике `each` на рельсах - PullRequest
1 голос
/ 22 октября 2019

У меня есть приложение, в котором я отображаю альбомы и пользователей.

В настоящее время я выводю альбомы,

<main role="main" class="flex-shrink-0">
  <div class="container">
    <h1 class="mt-5">Albums</h1>
    <p class="lead">Here we show all albums and it's details</p>

    <div class="row">
      <% @albums.each do |album| %>
        <div class="col-md-4">
          <%# image_tag(@albumImage ['thumbnailUrl']) %>
          <h5 class="card-title">
            <%= album['title'] %>
          </h5>

          <p>By: <%= album['userId'] %><p>
          <%= link_to "View Album", album_path(album['id']), class: "btn btn-primary" %>
        </div>
      <% end %>
    </div>
  </div>

  <%= will_paginate @albums, renderer: WillPaginate::ActionView::BootstrapLinkRenderer, class: 'margin-auto' %>
</main>

Но я хочу получить пользователя, чтобы я мог отобразитьимя создателя альбома, в настоящее время я показываю идентификатор пользователя альбома

<p>By: <%= album['userId'] %><p>

В идеале я хотел бы сделать что-то вроде этого

<p>By: <%= album.user['name'] %><p>

Все данные поступают извнешний API, в контроллере у меня

require 'will_paginate/array'

class AlbumsController < ApplicationController
  def index
    @albums = HTTParty.get('https://jsonplaceholder.typicode.com/albums', :headers => {'Content-Type' => 'application/json'}).paginate(:page => params[:page], :per_page => 10)
    @user = HTTParty.get('https://jsonplaceholder.typicode.com/users', :headers => {'Content-Type' => 'application/json'})
  end
end

Не уверен, как лучше подойти к этому.

1 Ответ

1 голос
/ 22 октября 2019

Во-первых, я собираюсь предположить, что @user на самом деле array из users. Если это правда, вы можете сделать следующее:

require 'will_paginate/array'

class AlbumsController < ApplicationController
  def index
    @albums = HTTParty.get('https://jsonplaceholder.typicode.com/albums', :headers => {'Content-Type' => 'application/json'}).paginate(:page => params[:page], :per_page => 10)
    @users = HTTParty.get('https://jsonplaceholder.typicode.com/users', :headers => {'Content-Type' => 'application/json'})
  end
end

Затем вы сможете сделать следующее:

<main role="main" class="flex-shrink-0">
  <div class="container">
    <h1 class="mt-5">Albums</h1>
    <p class="lead">Here we show all albums and it's details</p>

    <div class="row">
      <% @albums.each do |album| %>
        <div class="col-md-4">
          <%# image_tag(@albumImage ['thumbnailUrl']) %>
          <h5 class="card-title">
            <%= album['title'] %>
          </h5>

          <p>By: <%= @users.find{|u| u['id'] == album['userId']}.try(:[],'name') || 'not available' %><p>
          <%= link_to "View Album", album_path(album['id']), class: "btn btn-primary" %>
        </div>
      <% end %>
    </div>
  </div>

  <%= will_paginate @albums, renderer: WillPaginate::ActionView::BootstrapLinkRenderer, class: 'margin-auto' %>
</main>

Это:

@users.find{|u| u['id'] == album['userId']}

.. . Итерирует массив @users и найдет user с id, который соответствует album['userId'].

. Это:

.try(:[],'name')

... попытается получитьname атрибут из найденного user, но не выдаст ошибку и ошибку, если user не был найден.

И это:

|| 'not available'

... отобразит 'недоступно », если user не имеет name или user не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...