- 更新日: 2014年11月13日
- Rails
RailsでAtomフィードを生成
Rails で特定のユーザーが投稿したポスト一覧の Atom フィードを生成します。”user has_many posts” という関連を持つモデルの場合です。Rails の Builder を使って、あっという間に Atom フィードを生成できました。
— 環境 —
Rails 4.1
【追記 2014/11/14】
users#post は複数形のほうが良いと考えなおしたので、users#posts に変更しました。
ルーティング設定
まず、ルーティング確認。
config/routes.rb
1 2 3 4 5 6 7 |
RailsApp::Application.routes.draw do # ... get '/users/:id/posts', to: 'users#posts' # ... end |
このルーティングにより /users/:id/posts のパスで、特定ユーザーの投稿一覧ページにアクセスできる前提とします。
UsersController で respond_to でフォーマット設定
UsersController の posts メソッドで、respond_to メソッドを用いて、レンダリングを行うフォーマットを指定します。
app/controllers/users_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class UsersController < ApplicationController # ... def posts @user = User.find(params[:id]) @posts = @user.posts respond_to do |format| format.html format.atom end end # ... end |
respond_to メソッドで、html 及び atom のフォーマットを指定した例です。これにより、ビューで posts.html.erb と posts.atom.erb の両方を利用できます。
Atom フィード用のビューを作成
ビューファイルの拡張子を .atom.builder にします。
views/users/posts.atom.builder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
atom_feed do |feed| feed.title("User's posts") feed.updated((@posts.first.created_at)) @posts.each do |post| feed.entry( post, url: "http://example.com/posts/#{post.id}" ) do |entry| entry.title(post.title) entry.content(post.content, type: 'html') entry.author do |author| author.name(post.user_name) end end end end |
これで、/users/:id/posts.atom のパスで Atom フィードを表示できます。Rails 使うと何事も簡単に実現できて、ますます Rails が好きになっちゃいますね!
- – 参考リンク –
- Action View Overview — Ruby on Rails Guides
- Action View Overview — Ruby on Rails Guides
- Create an RSS feed in Rails
- Ruby on Railsで、RSSフィード 一言多いプログラマーの独り言
- ぱち ブログ
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!