На Rails отображаются только опубликованные эпизоды из Simplecast API. - PullRequest
0 голосов
/ 23 апреля 2020

Я запускаю приложение rails, которое вызывает Simplecasts API для отображения моих эпизодов подкаста Я следовал руководству по настройке сервисов API с помощью Фарадея. Мой вопрос: как отобразить только опубликованные эпизоды на моей странице индекса? Обычно я добавляю .where(:status => "live") в моем контроллере, IE @podcasts = Episodes.where(:status => "published"), но это, похоже, не работает.

API Simplecast для подкаста возвращает collection, который содержит все доступные эпизоды, каждый из которых имеет узел status.

Любая помощь будет принята, поскольку я новичок в работе с внешние API в Rails

Пример ответа API

"collection": [
    {
        "updated_at": "2020-03-25T17:57:00.000000-04:00",
        "type": "full",
        "token": "lgjOmFwr",
        "title": "Test",
        "status": "draft",

Episode.rb

module Simplecast
  class Episodes < Base
    attr_accessor :count,
                  :slug,
                  :title,
                  :status

    MAX_LIMIT = 10

    def self.episodes(query = {})
      response = Request.where('/podcasts/3fec0e0e-faaa-461f-850d-14d0b3787980/episodes', query.merge({ number: MAX_LIMIT }))
      episodes = response.fetch('collection', []).map { |episode| Episode.new(episode) }
      [ episodes, response[:errors] ]
    end

    def self.find(id)
      response = Request.get("episodes/#{id}")
      Episode.new(response)
    end

    def initialize(args = {})
      super(args)
      self.collection = parse_collection(args)
    end

    def parse_collection(args = {})
      args.fetch("collection", []).map { |episode| Episode.new(episode) }
    end
  end
end

Контроллер

class PodcastsController < ApplicationController
  layout "default"


  def index

    @podcasts, @errors = Simplecast::Episodes.episodes(query)

    @podcast, @errors = Simplecast::Podcast.podcast(query)

    render 'index'
  end

  # GET /posts/1
  # GET /posts/1.json
  def show
    @podcast = Simplecast::Episodes.find(params[:id])
    respond_to do |format|
      format.html
      format.js
    end
  end

  private
    def query
      params.permit(:query, {}).to_h
    end
end

1 Ответ

0 голосов
/ 23 апреля 2020

Похоже, что коллекция - это всего лишь массив хэшей, поэтому методы rail ActivrRelations aka .where не поддерживаются. Однако это массив, так что вы можете просто отфильтровать этот массив:

publ_episodes = collection.filter {| episode | episode [: status] == «опубликовано»}

Также просмотрите их API - может быть, есть поддержка дополнительных параметров фильтрации, так что вы получите в первую очередь только опубликованные эпизоды.

Кстати: вторая мысль - сохранить данные запроса внешнего API в вашей собственной БД, а затем получить требуемые эпизоды со стандартным потоком .where.

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