Rails RSS Feed Builder за элемент - PullRequest
       64

Rails RSS Feed Builder за элемент

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

Прямо сейчас у меня есть один канал RSS, который получает список эпизодов, которые принадлежат метро. Я хотел бы создать канал RSS на метро . Итак, city1.rss, city2.rss, city3.rss, cityN.rss.

rout.rb

resources :metros do
     collection do
       get :feed
     end
  end

metros_controller.rb

  def feed
    @metros = Metro.all
    @episodes = Episode.published.order("created_at DESC")

    @metros.each do |metro|
        metro.rss { render action: :index, name: @metro.name }
    end
  end

index.rss.builder

xml.rss :version => "2.0", "xmlns:itunes" => "http://www.itunes.com/dtds/podcast-1.0.dtd",  "xmlns:media" => "http://search.yahoo.com/mrss/", "xmlns:atom" => "http://www.w3.org/2005/Atom" do
  xml.channel do
    xml.title title
    xml.description description
    xml.language 'en'
    xml.pubDate @episodes.first.created_at.to_s(:rfc822)
    xml.lastBuildDate @episodes.first.created_at.to_s(:rfc822)
    xml.itunes :author, author
    xml.itunes :keywords, keywords
    xml.itunes :explicit, 'clean'
    xml.itunes :image, :href => image_url('cover.jpg')
    xml.itunes :owner do
      xml.itunes :name, author
    end
    xml.itunes :block, 'no'
    xml.itunes :category, :text => 'News' do
      xml.itunes :category, :text => 'News'
    end

    @episodes.each do |episode|
      xml.item do
        xml.title episode.title
        xml.description episode.description
        xml.pubDate episode.created_at.to_s(:rfc822)
        xml.enclosure :url => episode.s3, :length => 5, :type => 'mp3'
        xml.link episode_url(episode)
        xml.guid({:isPermaLink => "false"}, episode_path(episode))
        xml.itunes :author, author
        xml.itunes :subtitle, truncate(episode.description, :length => 150)
        xml.itunes :summary, episode.description
        xml.itunes :explicit, 'no'
        xml.itunes :duration, 5
      end
    end
  end
end

Я получаю ошибку:

неопределенный метод `rss 'для #Metro: 0x00007faaaa96b278

1 Ответ

0 голосов
/ 09 октября 2019

Вы пытаетесь создать несколько RSS-каналов, когда запрос переходит к metros/feed.rss

Сначала вам нужно настроить правильное значение routes, самое главное, что вы хотите передать parameter на action.

rout.rb

resources :metros do
  get ':city' to: 'metros#feed' #creates a named parameter 
end

Так что теперь, если вы можете теоретически позвонить metros/chigaco.rss, вы можете использовать Чикаго в вашем metros_controller.rb

def feed
  @metro = Metro.find_by_name(params[:name])
  @episodes = @metro.episodes.published.order("created_at DESC")
  render action: :index, name: @metro.name 
end

Проблема в том, что это не сработает, так как маршрут `/ metros /: id ', указывающий на индекс, имеет приоритет. Так что для этого лучше настроить отдельный маршрут:

  get 'feed/:name', to: 'metros#feed' 
...