现在,我有一个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'
当请求转到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'