首页 > 解决方案 > 每个项目的 Rails RSS Feed Builder

问题描述

现在,我有一个 RSS 提要,其中包含属于地铁的剧集列表。我想做的是为每个 metro生成一个 RSS 提要。所以 city1.rss、city2.rss、city3.rss、cityN.rss。

路线.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

我得到的错误是:

#Metro:0x00007faaaa96b278 的未定义方法“rss”

标签: ruby-on-railsrubyruby-on-rails-4

解决方案


当请求到达时,您正在尝试创建多个 RSS 提要metros/feed.rss

首先,您需要设置正确routes的,最重要的是,您想将 a 传递parameteraction.

路线.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

问题是这行不通,因为指向 index 的路由 `/metros/:id' 优先。因此,最好为此设置单独的路线:

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

推荐阅读