最近、railsでrssフィードを作ったので、そのへんのやり方をメモしておきますm( )m
作るもの
今回は、Rssフィード(Feed)とそれに紐づく記事(Entry)を元にRSSフィードを作成します。
イメージは/feeds/id.rss
にアクセスした際に下記のようなxmlを生成するイメージです👀
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>無題のボード</title> <description>「MadogiwaBlog、yahoo天気(東京)、Codezine」をまとめたRSSフィードです。</description> <link>https://example.com</link> <lastBuildDate>Sun, 06 May 2018 23:11:20 +0900</lastBuildDate> <language>ja</language> <copyright>© copyright 2019 Madogiwa All Rights Reserved.</copyright> <item> <title>【 24日(日) 東京(東京) 】 曇り - 14℃/3℃ - Yahoo!天気・災害</title> <description>曇り - 14℃/3℃</description> <pubDate>Sun, 24 Feb 2019 20:00:00 +0900</pubDate> <link>https://rdsig.yahoo.co.jp/weather/rss/RV=1/RU=aHR0cHM6Ly93ZWF0aGVyLnlhaG9vLmNvLmpwL3dlYXRoZXIvanAvMTMvNDQxMC5odG1sP2Q9MjAxOTAyMjQ-</link> </item>
実際のコード
作り方は意外とシンプルで、respond_to
でformat.rss
でshow.rss.builder
をレンダリングしてあげればOKです🙆♂️
class FeedsController < ApplicationController def show @feed = Feed.find(params[:id]) @entries = @feed.entries.recent respond_to do |format| format.html format.rss { render layout: false } end end end
show.rss.builder
内の日付系の項目はrfc2822
形式でformatする必要があることに注意です👀
xml.instruct! :xml, version: '1.0' xml.rss(version: '2.0') do xml.channel do xml.title @feed.title xml.description @feed.description xml.link 'https://example.com' xml.lastBuildDate @entries.last.published_at.rfc2822 xml.language 'ja' xml.copyright '© copyright 2019 Madogiwa All Rights Reserved.' @entries.each do |entry| xml.item do xml.title entry.title xml.description entry.description xml.pubDate entry.published_at.rfc2822 xml.link entry.link end end end end
特にGemとか使わなくても結構簡単に出来るんですね🙌