2017-08-07

RailtieでControllerを拡張する

勉強がてら、Controllerを拡張するRailtieを作ってみたので備忘録。基本的な作り方はこちらの記事と記事内の参考URLを参考にすると良いです。

プラグイン用にスケルトン作成

$ rails plugin new try_railtie --skip-bundle

lib/try_railtie.rb で拡張用のモジュールと独自Railtieへのrequireを定義

module TryRailtie
  extend ::ActiveSupport::Concern
  
  def hello
    "Hello Railtie"
  end

  module ClassMethods
    def define_param(name)
      define_method name do
        params[name]
      end
    end
  end
end

require 'try_railtie/railtie' if defined?(Rails)

lib/try_railtie/railtie.rb で独自Railtieを定義。ActiveSupport.on_load :action_controllerでモジュールをインクルード

module TryRailtie
  class Railtie < Rails::Railtie
    initializer "try_railtie.include_module" do
      ActiveSupport.on_load :action_controller do
        ActionController::Base.include ::TryRailtie
      end
    end
  end
end

テスト用アプリのディレクトリに移動してコントローラ一式を作成

$ cd test/dummy
$ bin/rails g controller home index

test/dummy/app/controllers/home_controller.rb

class HomeController < ApplicationController
  define_param :foo

  def index
    @hello = hello
    @foo = foo
  end
end

test/dummy/app/views/home/index.html.erb

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<p>hello = <%= @hello %></p>
<p>foo = <%= @foo %></p>

ダミーアプリを起動してプラグインの挙動をテスト

$ cd test/dummy
$ bin/rails s -b 0.0.0.0
このエントリーをはてなブックマークに追加