Rails RSS Feed Builder每个项目

问题描述 投票:1回答:1

现在,我有一个RSS提要,该提要获得了属于一个Metro的情节列表。我想做的是生成一个RSS feed per metro。因此,city1.rss,city2.rss,city3.rss,cityN.rss。

routes.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-rails ruby ruby-on-rails-4
1个回答
0
投票

当请求转到metros/feed.rss时,您正在尝试创建多个RSS feed。>

首先,您需要设置正确的routes,最重要的是,您想将parameter传递给action

routes.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' 
© www.soinside.com 2019 - 2024. All rights reserved.