Madogiwa Blog

主に技術系の学習メモに使っていきます。

rails: Rssフィードの作り方MEMO

最近、railsrssフィードを作ったので、そのへんのやり方をメモしておきます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_toformat.rssshow.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とか使わなくても結構簡単に出来るんですね🙌

参考

miner.hatenablog.com

apidock.com