TOP BLOG Rails| RSS|

『Rails』RSSフィードを生成してランキングサイトへ記事を反映させる【builder】

どうも皆さん@ちょめこです。

このブログサイトは初学者の僕が独学で
Ruby on Railsで作ったブログサイトです。
間違っている所もあるかもしれません。
あくまで参考程度にしていただけたらなと思います。
何かありましたらお問い合わせか、Twitterよりご連絡下さい。

一体RSSとは何なのか?



僕はランキングサイトに登録をしています。

にほんブログ村と人気ブログランキングです。

ブログをWorldpressや他のブログサイト等で作っている人たちは、知っていると思いますが、ブログの記事を書いたら、書いた記事がランキングサイトのマイページに反映されます。

それはRSSを配信しているからです。

RSSっていうのは、ブログの概要や更新情報(更新記事)などを、第三者のコンピュータシステムや、RSSを取得するためのRSSリーダー(フィードリーダー)に、伝えるために使われるものです。

そして、にほんブログ村のようなブログサイトのコンピュータシステムや、RSSリーダーは、RSSに掲載されている自分のブログの概要や、更新情報を自動で収集してくれます。

自動で収集してくれますが、ブログを書いたらすぐ反映してほしいですよね!

そのために今度はping送信があります。


pingとは?


ブログを更新した時にPing送信先URLに向けてブログを更新しました!

今記事を書き終わりました!という更新信号を送ることができます。

ランキングサイトのマイページから、専用Ping送信先URLをコピーして、ご自分のサイトのping設定やらに追加してpingを送信します。

新しい記事を投稿したことをランキングサイトに伝え、その記事を素早く確実に反映・表示させるための更新通知機能のことです。

このブログにはそんな便利なものはないしそもそもそんなこと知りませんでした


はい!!!!

そうですこのブログは、自分で0から作り上げたブログサイトなので、そんなものは導入しておりませんでした!

そもそも記事をブログサイトに反映させれるなんて事も、できると思ってませんでしたw

そのランキングサイトと繋がってる無料ブログやら有料ブログで、記事を書いたら反映できるくらいに思っていたのです。

ですがある時ブログサイトから突然メールが来たのです。

いつも色々本当にありがとうございます。
にほんブログ村サポートチームです。

平素は素晴らしいブログをご登録いただき、
また多大なるご協力をいただき本当にありがとうございます。

さて早速ではございますが、にほんブログ村では
出力されているRSSより記事の情報を取得してマイページなどに表示を行っておりますが、
大変申し訳ございませんが、今現在、ちょめこさまのRSSが不明のため
記事情報を取得することができません。

そのためお手数をおかけいたしまして申し訳ございませんが、
出力されているRSSフィードのURLをお知らせいただけますと幸いです。

お手数をおかけいたしまして申し訳ございませんが、
どうぞよろしくお願いいたします。

めっちゃ親切!!感激!!

RSSフィードのURL?

なんだそれ?

それがあれば反映できるの...そうか....

じゃー作っちまえええええええ!!!!!

これでRSSの存在を知って作成することになりました。

そもそも作れるのかな〜って思ってググると、あれまなんて事でしょう簡単に作れるではありませんか!!!

パパッと作っちゃお!!!
この時はハマるなんて思っていませんでした。

RSSを生成してみます


ここから実装に入ります。

まずは参考にさせてもらった記事を貼ります。
こちら

Railsではgem無しで作れるらしくBuilder::XmlMarkupクラスを使って作成できるらしいです。

まずはコントローラーのindexに、formatの追加をしていきます。

indexアクションには、公開記事を表示させています。

/controllers/blogs_controller.rb
def index
    @blogs = Blog.published.order(time: "DESC").page(params[:page]).per(10)
    @blogs_side = Blog.published.order(time: "DESC")

    respond_to do |format|
      format.html
      format.rss { render :layout => false }
    end

ここでフォーマットの指定ですね。
respond_to do |format|

format.形式 { 行いたい処理の内容 }このように指定していきます

ここでhtmlを指定しないとerrorになります。

ちなみに何も処理を書かなければ、デフォルトのテンプレートが指定されたフォーマットで表示します。
format.html

ここでrssを指定します。処理の内容は
format.rss { render :layout => false }
RSSビューからレイアウトを使わないで表示します。

次に/views/blogs/index.rss.builderファイルを作成してください。
その中に設定を書いていきます。

/views/blogs/index.rss.builderに
cache 'feed_cache_key', expires_in: 30.minutes do
  xml.instruct! :xml, :version => "1.0"
  xml.rss :version => "2.0" do
    xml.channel do
      xml.title "PGMG"
      xml.description "​こちらは初学者の僕が独学で勉強して製作したRuby on Railsのブログサイトになります。"
      xml.link root_url

      @blogs.each do |b|
        xml.item do
          xml.title b.title
          xml.description strip_tags(b.rich_text_body.to_s.gsub(/\r\n|\r|\n|\s|\t/, "")).truncate(120)
          xml.image image_url(url_for(b.image))
          xml.pubDate b.time.to_s(:rfc822)
          xml.link blog_url(b)
          xml.guid blog_url(b)
        end
      end
    end
  end
end

コードの解説をします



cache 'feed_cache_key', expires_in: 30.minutes do
負荷がかかってしまうのでキャッシュを導入した方がいいらしいです。
これで30分間キャッシュされるようになります。

まだ記事が少ないうちは大丈夫そうですが、今後を考えるとやっておいたほうがいいですね!!

ここでバーションを指定
 xml.instruct! :xml, :version => "1.0"

ここもバーションを指定
xml.rss :version => "2.0" do

ここではrootにしてるあるトップページのサイト名と説明をしてます。
xml.channel do
      xml.title "PGMG"  ここはサイト名
      xml.description "​こちらは初学者の僕が独学で勉強して製作したRuby on Railsのブログサイトになります。"
      xml.link root_url

@blogsはcontrollerで設定しましたね。
@blogs = Blog.publishedになっています。

公開記事だけをeachで回していきます。
 @blogs.each do |b|

アイテムは、タイトル,説明文,画像,公開日,URLにしました。
xml.item do

タイトル名
xml.title b.title

説明文にはactiontextの記事を使いますが、少しここでハマりました。

b.bodyではなく、b rich_text_bodyを使いました。

そのままだとHTMLや空白とかも入っちゃうので除去します。

説明文に、120文字制限をかけて、空白,改行,タグを除去してます。
 xml.description strip_tags(b.rich_text_body.to_s.gsub(/\r\n|\r|\n|\s|\t/, "")).truncate(120)

まずhtmlタグを除去するメソッド
  • strip_tagsメソッド

actiontextの文章を呼び出す
  • b.rich_text_body

数字とかを文字列に変換する
  • .to_sメソッド

正規表現にマッチした部分をすべて変換する
  • gsubメソッド

すべての改行コードをマッチする正規表現
  • \r\n|\r|\n

空白文字の正規表現
  • \s

タブの正規表現
  • \t

上の正規表現を無にするってか無に置換するw
  • ""

文字制限120文字
  • .truncate(120)

OSによって改行の種類があるらしい。
Windows 環境の改行コード
\r\n

Mac 環境での改行コード
\r

Linux 環境の改行コード
\n 

これで説明のところが、action textの文章を冒頭120文字で呼び出すことができました。



画像の設定でハマる


次は画像の指定をしますが、僕はactive storageで画像アップロード機能を付け足しています。

なので普通にimage_urlだけではなぜかerrorでダメでした。

色々試した結果このような呼び出し方で一応httpのURLが呼びだせました。

xml.image image_url(url_for(b.image))

呼び出し後URLはこちら
<image>http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--230f663c663a9f539231d1685939441078c0a43b/coding-1853305_1920.jpg</image>

でもこれだと結局ダメでした。

にほんブログ村はOGPを見て設定してくれるらしいのですが、僕はOGPもこの画像のURLを設定しています。設定した記事を置いときます。


これでTwitterとかのOGPの画像はちゃんと反映されているのですが、にほんブログ村からはURLが長すぎて画像の取得に失敗するという連絡が入ったのです。

タイトル名や説明文はちゃんと反映できていましたが、画像に関してはまだ解決できてません。
どなたかわかる方がいらっしゃれば、ぜひ教えていただきたいです....。

にほんブログ村にはこのように反映されました。
にほんブログ村



お次は公開日の設定をします

xml.pubDate b.time.to_s(:rfc822)

  • まずはb.time

これは人によって違うと思います。

僕は公開日っていうカラムを別途作っていて、そのカラムがtimeになってます。

timeには記事を公開日にした時間を入れています。

下書き記事を作って文章を書き、完成したら公開にしますよね。

なのでこのような仕様にしてます。

記事も前書いたのでよかったらどうぞ。


  • .to_s
数字を文字列に変換しています。

  • (:rfc822)
日付の形式を変換してます。

Builder::XmlMarkupクラスを使ってのRSSでは、日付は自動的に変換してくれないらしいので、形式を指定して変換してあげる必要があるっぽいです。多分w

xml.link blog_url(b)

これは各ページのlinkですね。

URLを返します。

xml.guid blog_url(b)

これも各ページのlinkになります。

これは必要なのか?

とりあえずセットでこれもやっときました。

ちょっとよくわかりませんw



これで一通りの設定が終わりました。

最後に

app/views/layouts/application.erbの<head>内に1行追加します。

<%= auto_discovery_link_tag :rss, blogs_url(:format => :rss) %>

  • auto_discovery_link_tag
ブラウザ、フィードリーダーがRSS、Atom、またはJSONフィードの自動検出に使用できるリンクタグを返します。

ぐぐりましたw

  • :rss
ここがtypeを指定することができて、今回はrssです。
他にもatomやjsonも指定できるらしい。

  • blogs_url(:format => :rss)
これはURLのformatをrssに指定してます。そのまんまですねw

RSSを確認してみる


ここまででRSSを生成することができています。

確認して見ます。

トップページに行って右クリックを押します。

そしたらページのソースを表示があるのでここをクリック。
ページのソース

上から順に見ていくとこのようなHTMLがあると思います。

<link rel="alternate" type="application/rss+xml" title="RSS" href="http://localhost:3000/blogs.rss" />

ここのURLをクリックしてください。

そしたらRSSのページに飛ぶと思います。

このような感じになっていて自分が設定した通りの情報がちゃんと載っていれば成功です。


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>PGMG</title>
    <description>​こちらは初学者の僕が独学で勉強して製作したRuby on Railsのブログサイトになります。</description>
    <link>http://localhost:3000/</link>
    <item>
      <title>Railsでログイン状態を保持する方法</title>
      <description>あああああああああああああああああああああああああ...</description>
      <image>画像.jpg</image>
      <pubDate>Sun, 15 Sep 2019 13:07:08 +0900</pubDate>
      <link>http://localhost:3000/blogs/14</link>
      <guid>http://localhost:3000/blogs/14</guid>
    </item>

Googl search consoleに追加


どうやらsitemapの他にも、rssをGoogl search consoleに登録した方がSEO的にいいらしい。

なので追加してみました。

でもこれって更新はどうなるんだろうか?

1回追加しちゃえば勝手にgoogleさんが見てくれるのか?

そのへんがまだよくわかってないけど、まーとりあえずこのままでいっか!

------------
9月16日追記------------
勝手に更新できてました。
クローラーが定期的に来て更新してくれます。
--------------------------------------------



これで以上になります!

ただ画像に関してはどうしても解決できませんでした。

悔しいけど情報も見つけれないので、今はこれでやっていこうと思います。

ではこれでお終いです。
ありがとうございました!!!!


ランキング参加中〜♫ ポチッと!

ブログランキング・にほんブログ村へ
戻る