RailsでRss Builderを使用してCDATAで文字を囲む方法
Rssの配信をRailsで行う際に細かい仕様を突破する必要がある場合があります。
今回は強引にRssBuilderを使用して、やや強引に細かい仕様を突破していく方法をご紹介します。
RailsでRssBuilderを使用して頑張らないといけない方の参考になればと思います。
今回の題材では以下の仕様を突破する必要があることを想定しています。
Rssの仕様
- CDATAで文字データを囲む必要がある
- CDATAは改行(ネスト)しないようにしたい
CDATAでネストしないRss Builderの書き方
早速ソースを公開しています。 結論からいうと以下のように実装するとCDATAでネストしないRss Builderの書き方になります。
xml.instruct! :xml, version: '1.0' xml.rss('version': '2.0', 'xmlns:dc': 'http://purl.org/dc/elements/1.1/') do xml.channel do # インデント分だけ空白を追加しています xml << " <title><![CDATA[タイトル]]></title>\n" xml << " <description><![CDATA[概要]]></description>\n" xml.link 'URL' xml.image do xml.url 'ロゴURL' xml.title 'サービス名' xml.link 'ロゴURL' xml.width 'イメージ幅' xml.height 'イメージ高さ' end @articles.each do |article| xml.item do # インデント分だけ空白を追加しています xml << " <title><![CDATA[#{article.title}]]></title>\n" xml << " <description><![CDATA[#{article.description}]]></description>\n" if article.description? xml.pubDate article.updated_at.to_s(:rfc822) if article.updated_at? xml.guid "記事URL" xml.link "記事URL" # インデント分だけ空白を追加しています xml << " <category><![CDATA[カテゴリ名]]></category>\n" end end end end
そもそもなぜRssで細かい仕様を突破する必要があるのか?
例えば外部のサービスと連携をする場合には、外部サービスのクローラーが取得しやすい形式でRSSを配信する必要があります。
この場合はそのクローラーの仕様に合わせてRssの配信形式を変更する必要があり、今回自分が対応した経緯も外部連携がきっかけでした。
やや強引な方法での実装を行ってしまっていますが、こういった事情でやむなく実装を強引に行うことは多々あると思うので、何かのご参考になればと思います。
どこでこういう方法を知るの?
こんな感じで突破する技術はあまり表には出ないものです。なぜなら、我ながらスマートな方法では無い自覚があるので、あまり表に出したく無い心理は理解できます。。。
ただ、現場では突破する力も非常に必要になり、それがビジネスを助けるということが往々にしてあるのも事実です。
このような方法は表に出ない傾向があるので、誰かに直接相談ができる方法を持っていると良いと思います!
私も以下のサービスでメンターを行っていますので、同じような悩みをお持ちの方は是非ご相談ください!