Rails2系アプリの管理機能を10分で作る方法

Rails 2.2.2で作ったWEBアプリの管理サイトを/admin/で始まるURLで作る手順をまとめました。
例えば「カテゴリー」(Category name:string position:integer)というモデルがあって、
そのマスターデータを管理したいという前提で。


(1)scaffoldをgenerateする

ruby script/generate rspec_scaffold Admin::Category name:string position:integer

って感じのコマンドでスケルトンを作ります。

  • nameとかpositionとかは編集対象となるフィールドを列挙。
  • rspecを使っていない場合は「rspec_scaffold」じゃなくて「scaffold」


(2)不要なファイルの削除
前の手順で「Admin::Category」を対象とした migration やら model やらが生成されます。
これは既存の「Category」を対象にしたいのでmodel関連の余計なファイルは削除します。

ruby script/destroy rspec_model Admin::Category


(3)変数名の置換

  • 「Admin::Category.」を「Category.」に
  • 「Admin::Category,」を「Category,」に
  • 「Admin::Category 」を「Category 」に
  • 「@admin_categories」を「@categories」に

します。コマンドで実行すると以下。
(grep の l オプションはファイル名のみ出力。v オプションは該当するファイルを除外。の意)。

grep -lr "Admin::Category." * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/Admin::Category\./Category\./g"
grep -lr "Admin::Category," * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/Admin::Category,/Category,/g"
grep -lr "Admin::Category " * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/Admin::Category /Category /g"
grep -lr @admin_categories * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/@admin_categories/@categories/g"


(4)URL関連のヘルパー名を置換

  • 「category_path」を「admin_category_path」に
  • 「categories_path」を「admin_categories_path」に
  • 「category_url」を「admin_category_url」に
  • 「categories_url」を「admin_categories_url」に

します。コマンドは以下。

grep -lr category_path * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back 's/category_path/admin_category_path/g'
grep -lr categories_path * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back 's/categories_path/admin_categories_path/g'
grep -lr category_url * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back 's/category_url/admin_category_url/g'
grep -lr categories_url * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back 's/categories_url/admin_categories_url/g'


(5)link_toの引数を書き換え

  • 「link_to 'Show', category」を「link_to 'Show', admin_category_path(category)」に
  • 「link_to 'Show', @category」を「link_to 'Show', admin_category_path(@category)」に
  • 「link_to 'Destroy', category」を「link_to 'Destroy', admin_category_path(category)」に
  • 「link_to 'Destroy', @category」を「link_to 'Destroy', admin_category_path(@category)」に

それぞれ置換。コマンドは以下。

grep -lr link_to * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/link_to 'Show', category/link_to 'Show', admin_category_path(category)/g"
grep -lr link_to * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/link_to 'Show', @category/link_to 'Show', admin_category_path(@category)/g"
grep -lr link_to * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/link_to 'Destroy', category/link_to 'Destroy', admin_category_path(category)/g"
grep -lr link_to * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/link_to 'Destroy', @category/link_to 'Destroy', admin_category_path(@category)/g"


(6)その他の置換

  • 「/admin_categories」を「/admin/categories」に
  • 「:controller => "admin_categories"」を「:controller => "admin/categories"」に
  • 「redirect_to(@category)」を「redirect_to(admin_category_url(@category))」に
  • 「assigns[:admin_categories]」を「assigns[:categories]」に

します。コマンドは以下。

grep -lr /admin_categories * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/\/admin_categories/\/admin\/categories/g"
grep -lr ':controller => "admin_categories"' * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/:controller => \"admin_categories\"/:controller => \"admin\/categories\"/g"
grep -lr "redirect_to(@category)" * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/redirect_to(@category)/redirect_to(admin_category_url(@category))/g"
grep -lr ":admin_categories" * | grep -v svn | grep -v back | grep -v log \
 | xargs sed -i.back "s/assigns\[:admin_categories\]/assigns\[:categories\]/g"


(7)form_forの引数を書き換え

  • new.html.erb の「form_for(@category)」を「form_for(@category, :url=>admin_categories_path)」に
  • edit.html.erb の「form_for(@category)」を「form_for(@category, :url=>admin_category_path(@category))」に

それぞれ書き換えます。


(8)routes.rbの編集

  map.resources :categories

  map.namespace :admin do |admin|
    admin.resources :categories
  end

にします。