QA@IT

Rails4のページングを含むルーティングについて

2948 PV

Rails4の勉強で、ブログのようなものを制作しています。
ルーティングについて、以下のすべてに対して適切なページを返すよう制作しようと考えています。

posts/index
posts/index/page/:page
posts/index/:year/page/:page
posts/index/:year/:month/page/:page
posts/index/:year/:month/:day/page/:page

この場合、ルーティングはどこまで綺麗に書けるでしょうか?
頑張って、以下のように2行に分けて動作するよう書けはしたのですが、あまり美しい気がせず。。。

resources :posts do
  get 'page/:page', action: :index
  get ':year(/:month(/:day))(/page/:page)', action: :index
end

参考にしたのは以下の記事です。

ご回答の程、よろしくお願いいたします。


追記です。
上記だと、うまく動作しませんでした。
posts/2014/page/2/を表示中、ページングのリンクがposts/2014/page/2/page/3/になったりしていました。。。


さらに追記です。
以下のようにconstraintsでフォーマットを指定して、動くようにはなりました。
ただ、もっとうまく書ける方法があれば、ぜひご教示ください。

get 'page/:page', action: :index
get ':year(/:month(/:day))(/page/:page)', action: :index, constraints: {
  year:  /\d{4}/,
  month: /\d{1,2}/,
  day:   /\d{1,2}/
}
  • こちら、まだ回答の方をお待ちしております。よろしくお願いいたします。 -

回答

綺麗に書けるは何を指しているかわかりませんが、
自分だったら以下のように設定します。

パス内に"index"を含める場合
config/routes.rb

  namespace :posts do
    get 'index'
    scope 'index' do
      get 'page/:page', action: :index
      scope ':year', year: /\d{4}/ do
        get 'page/:page', action: :index
        scope ':month', month: /\d{1,2}/ do
          get 'page/:page', action: :index
          scope ':day', day: /\d{1,2}/ do
            get 'page/:page', action: :index
          end
        end
      end
    end
  end

パス内に"index"を含めない場合
config/routes.rb

  namespace :posts do
    get 'index'
    get 'page/:page', action: :index
    scope ':year', year: /\d{4}/ do
      get 'page/:page', action: :index
      scope ':month', month: /\d{1,2}/ do
        get 'page/:page', action: :index
        scope ':day', day: /\d{1,2}/ do
          get 'page/:page', action: :index
        end
      end
    end
  end
get 'page/:page', action: :index

はどうにかしてまとめたいですね。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。