質問: Ruby on Railsでwebアプリを作っているのですが、コントローラーの記述が長くなってしまった場合、どのようにファイルを分割するのがいいのでしょうか? 今は、コマンドから新しくコントローラーを作って ``` class HogeController < ApplicationController ``` という形になっているやつにソースを移しているんですが、 ここにあるみたいに ``` class HogeController < BaseController ``` としたほうがいいのでしょうか? その場合ってコマンドからではなく直接rbを新規作成したほうがいいのですかね? コマンドから作るとviewsの下にフォルダ掘られちゃったりしているのですが・・・。 補足として、 MVCの扱いは ここにあるあるやつの「勘違い形式」でお願いします。 あと、趣味でやっているものなので、厳密な事は求めていません。あくまで一般的に、みんなはどうやっているのかな?というところで回答をお願い致します。
回答: 私も Rails 3.2 系で、BaseController を作り共通の処理を書きましたが、結局肥大化してしまい見通しが悪くなってしまいました。 そこで、Model 等でも利用している Concerns という部品に分解し、必要な場合に追加を行うようにしました。 例えば、以下の様に JSON 出力が必要な例外のハンドリングを Concerns にして注入しました。 ``` module ExceptionHandler extend ActiveSupport::Concern included do rescue_from Errors::BadRequest, with: :bad_request end protected def bad_request(exception) render_exception status: __method__, debug_message: [exception.message, exception.backtrace].join("\n") end def render_exception(args) status = args[:status].to_sym error_message = { status_code: Rack::Utils.status_code(status), status: status.to_s.humanize, message: args[:message] } respond_to do |format| format.json { render json: error_message, status: status } end end end ``` 独自の構造を作るときには基本的に Scaffold や Generator は利用しませんが、`rails generate controller MyContoroller`コマンドで生成を行っている場合、いくつかのオプションを付与することで生成物をスキップすることが出来ます。 ``` --skip-template-engine (--no-template-engine) # View の生成をスキップする ```