ruby-on-rails - 每个项目的 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”
解决方案
当请求到达时,您正在尝试创建多个 RSS 提要metros/feed.rss
首先,您需要设置正确routes
的,最重要的是,您想将 a 传递parameter
给action
.
路线.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'
推荐阅读
- json - 如何在弹性搜索中加载 json 文件
- sql - 如果值在列之间的范围内,则左连接
- java - 在第二个 gRPC 拦截器中的标头之前访问第一个 gRPC 拦截器中的消息请求
- google-forms - Google 表单中的数据输入(返回代码 401)
- c# - console.writeline 与 console.write
- javascript - JAVASCRIPT:#googtrans(en) 不起作用,但其他 #googtrans 语言很好
- c# - 需要解决 Checkmarx 中的 Cross_site_history 操纵漏洞
- python - Psycopg2 Postgres 插入带有单引号的文本的问题
- c# - Panopto SOAP API GetReport 500 内部服务器错误
- blazor - 使用 Blazor 应用程序的 log4net 记录到文件不起作用