Ruby on Rails - コントローラのグループ化!

Updated:


Ruby on Rails アプリを作成していて規模が大きくなってくると “controllers” ディレクトリに “**_controller.rb” というファイルがコントローラの数だけ増えていきます。 “controllers” ディレクトリのみならず、”views” ディレクトリも同様に増えます。

単純にファイルをグループ分け(ディレクトリ分け)してアクセス部分を修正すればよい、というものではありません。 今回は、コントローラをグループ化してみました。

ちなみに、「コントローラのグループ化」は「コントローラのネスト化」とかのように別の呼び方をする場合もあります。 WEB検索する場合は、色々な検索を試してみると取得できる情報も豊富になります。

グループ化の方法

0. 前提条件

  • Ruby 1.9.3-p194, Rails 3.2.3 での作業を前提としています。
  • コントローラ・ビューのグループ化に合わせて、URL も変更します。
  • こつこつと改修を重ねてきたアプリなので RESTful となっていません。(generator や scaffold を使ったりして作成した物でないということ)(RESTful だと抽象度が高くて自分には扱いにくいからというのもある)
  • アプリ名は “hoge_hoge” を、ディレクトリ構成は以下を想定しています。(ビューも同様)(メニュー画面から各画面へ遷移する形です)
[ 変更前 ]
hoge_hoge/app/controllers
        +--- application_controller.rb
        +--- menu_controller.rb
        +--- hoge_a_controller.rb
        +--- hoge_b_controller.rb
 ↓
[ 変更後 ]
hoge_hoge/app/controllers
        +--- application_controller.rb
        +--- menu_controller.rb
        +--- hoge
                +--- hoge_a_controller.rb
                +--- hoge_b_controller.rb

1. コントローラ・ビューをグループ分け

コントローラ・ビューを希望の形にグループ分け(ディレクトリ分け)します。 今回の場合、controllers ディレクトリ配下に hoge ディレクトリを作成し、その配下に hoge_a_controller.rb, hoge_b_controller.rb を移動します。 views ディレクトリも同様に views ディレクトリ配下に hoge ディレクトリを作成し、その配下に hoge_a, hoge_b ディレクトリを移動します。

2. コントローラ呼び出し部分修正

各ビュー内でコントローラを呼び出している部分を以下のように修正します。

:controller => "hoge_a"
 ↓ 変更
:controller => "hoge/hoge_a"

3. コントローラ内クラス定義部修正

コントローラ内のクラス定義をしている箇所を以下のように修正します。

class HogeAController < ApplicationController
 ↓ 変更
class Hoge::HogeAController < ApplicationController

4. config/routes.rb の編集

config/routes.rb を編集してルーティングを設定します。 これをしないと、”No route matches” のエラーが出ます。 RESTful なアプリなら namespace を設定しますが、RESTful でないので match で設定します。

HogeHoge::Application.routes.draw do
  # 以下2行は今回の改修前から設定しているもの
  root :to => 'menu#index'
  match ':controller(/:action(/:id))(.:format)'

  # 以下を追加
  match "/hoge/hoge_a" => "hoge/hoge_a#index"
  match "/hoge/hoge_b" => "hoge/hoge_b#index"

  # 別の書き方1
  # match "/hoge/hoge_a", :controller => 'hoge/hoge_a', :action => :index
  # match "/hoge/hoge_b", :controller => 'hoge/hoge_b', :action => :index

  # 別の書き方2
  # match "/hoge/hoge_a", :to => 'hoge/hoge_a#index'
  # match "/hoge/hoge_b", :to => 'hoge/hoge_b#index'
end

※アクションが index 以外にもあれば、それらも設定しないといけません。 ※元からのルーティング設定によっては追加の設定が上記と異なる場合があるかもしれません。

ちなみに、RESTful なアプリなら以下のようになると思われます。 (create, new 等のアクションは無視して index のみ有効にしたい場合です)

HogeHoge::Application.routes.draw do
  namespace :hoge do
    resources :hoge_a, only => [ 'index' ]
    resources :hoge_b, only => [ 'index' ]
  end
end

5. 動作確認

今まで “http://<サーバアドレス>/hoge_a” としていた部分を “http://<サーバアドレス>/hoge/hoge_a” としてアクセスしてみる。 今までどおりの画面が表示されればOK。 エラーが出る場合は修正漏れがあるのでエラーメッセージを頼りに修正を施す。 メニュー画面から遷移する形を採っている当方のアプリの場合、メニュー画面からの遷移もうまくいきました。


それほど複雑でないアプリならグループ分けする必要もありません。 今回の当方のアプリの場合、改修・追加で複雑化・肥大化してきたのでグループ分けしてみた次第です。

以上です。





 

Sponsored Link

 

Comments