RubricksにおけるURIの問題(1)
Rubricksではコンテンツを主に6つのパーティションに分割して表示する。5つはコンテンツブロックを入れるためのパーティションで、左・中央・右・中央左・中央右の各パーティションで、残りの1つがメインコンテンツを表示するためのパーティションとなる。そして、全コンテンツブロック及びメインコンテンツは全て別個のコントローラ・アクションによってレンダリングされる。そのため、CMS全体のスナップショットを表すURLを生成してあげる必要がある。
初期段階では、あるページ全体を現すのが「index」アクション、メインコンテンツを表すのが「main」アクションで決め打ちで、各コンテンツブロックの情報はDBに格納という形をとっていた。これだとlink_to_main(メインコンテンツだけを更新するためのlink_to_remoteの拡張)を利用したスナップショットは表すことができない。特定部分だけlink_to_remoteで更新されたところまでは兎も角、せめてメインコンテンツの遷移くらいはスナップショットを用意しておきたい、ということでroutes.rbを弄ってみた。
[更新前] ActionController::Routing::Routes.draw do |map| # Install the default route as the lowest priority. map.connect ':controller/:action/:id' map.connect '', :controller => 'index', :action => 'index' end [更新後] ActionController::Routing::Routes.draw do |map| # Install the default route as the lowest priority. map.connect ':controller/:action/:id', :action => /^[^_].*/, :main => 'main' map.connect ':controller/:main/:id', :action => 'index', :main => /^_.*/ map.connect '', :controller => 'index', :action => 'index', :main => 'main' end
2番目のパラメータを正規表現で条件分岐している。頭に「_」がついている場合は「main」というパラメータとして扱い、「action」には固定値を代入する。ついていない場合は「action」として扱い、「main」に固定値を代入する。
URL | 表示される内容 |
/sample/show/1 | SampleControllerのshowアクションで1番目のレコードを表示 |
/sample/_show/1 | Rubricksのメインコンテンツに上記内容を埋め込んだものを表示 |
これでかなりスマートになった。と思ったらエラーになってしまった。「url_forでURLが生成できません」という内容だ。どうも、全てのケースに:mainを追加したために:mainがurl_forの引数として必須になってしまったようだ。routesとurl_forが密接に関係しているのは知っていたが、ここまで連動しているのね。回避策として、:mainのデフォルト値を設定する。
class ApplicationController < ActionController::Base def default_url_options(options) {:main => 'main'} end . . . end