motorhead というA/Bテストや機能の限定公開のフレームワークを使ってみる

motorhead（0.38）は、Ruby on Rails で、A/Bテストや機能の限定公開をするために作られたフレームワークです。

* https://github.com/amatsuda/motorhead

# インストールと初期設定

## 初期設定

今回は、scaffoldで Book を作ります。

```bash
$ rails new motorhead
$ bundle install
$ rails generate scaffold Book name:string description:text price:integer
$ rake db:migrate
```

## インストール

`bundle install` で motorhead のインストールします。
Gemfile の設定は下記の通りにしてみました。

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails', '4.2.5'
gem 'sqlite3'
gem 'mysql2'
gem 'sass-rails'
gem 'uglifier'
gem 'coffee-rails'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder'
gem 'sdoc', '~> 0.4.0', group: :doc

gem 'motorhead', require: ['motorhead', 'motorhead/road_crew']

group :development, :test do
  gem 'byebug'
  gem 'web-console'
  gem 'spring'
end
```

※ MySQL の利用を設定していますが、motorheadとは関係ないです

# motorhead で、Rails::Engine を作る

motorheadは、Rails::Engineを利用した機能提供を行います。
motorhead を利用して、開発したい機能を作る土台を用意します。

## ジェネレーターを利用

motorhead には、ジェネレーターがあり、それを利用すると簡単に作れます。

```
$ rails g motorhead publisher
Running via Spring preloader in process 78099
      create
      create  publisher.gemspec
      create  MIT-LICENSE
      create  app
      create  app/controllers/publisher/application_controller.rb
      create  app/helpers/publisher/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/publisher/application.html.erb
      create  app/assets/images/publisher
      create  app/assets/images/publisher/.keep
      create  config/routes.rb
      create  lib/publisher.rb
      create  lib/tasks/publisher_tasks.rake
      create  lib/publisher/version.rb
      create  lib/publisher/engine.rb
      create  app/assets/stylesheets/publisher/application.css
      create  app/assets/javascripts/publisher/application.js
      remove  MIT-LICENSE
      remove  app/controllers/publisher/application_controller.rb
      remove  lib/tasks
        gsub  publisher.gemspec
        gsub  publisher.gemspec
      append
```

# テンプレートだけを限定公開する

ある条件に合わせて、作った機能を公開しようと思います。
本（Book）の価格（price）が1000よりも大きければ、表示するようにします。例えばですが、Bookの発売時期や、社内ユーザのみに公開するリンクなどがありそうです。

## 条件の設定をする

```ruby:app/engines/publisher/lib/publisher/engine.rb
require 'motorhead/engine'

module Publisher
  class Engine < ::Rails::Engine
    include Motorhead::Engine

    active_if { @book.price > 1000 }
  end
end
```

## 限定公開するテンプレートを用意する

`app/engines/エンジン名/app/views/エンジン名/テンプレートファイル` にファイルを置きます。今回は、試してみるために幾つか置いてみました。

### 1種類目

```html:app/engines/publisher/app/views/publisher/_show.html.erb
<p style="border:1px solid red;padding: 1em;">
<%= @book.name %>は、1,000 以上です
</p>
```

### 2種類目

```ruby:app/engines/publisher/app/views/publisher/footer/_show.html.erb
<p style="border:1px solid red;padding: 1em;">
<%= @book.name %>の出版社情報です
</p>
```

### 読み込んでいるmotorheadの一覧の確認

motorhead の機能として下記のような記述をすると、motorheadで読み込んでいるエンジンの一覧を表示することができます（それ以上のことはよくわかっていないです…）

```html:app/views/books/show.html.erb
<%= render engine: 'road_crew/button', locals: {label: '限定機能'} %>
```

## 公開しているテンプレートに設定する

```html:app/views/books/show.html.erb
<%= render engine: 'publisher/show' %>
<%= render engine: 'publisher/footer/show' %>
```

## 結果

Egines List に出ている`NewPublisher`や`NewFetureBook`は、今回のとは別に用意していたEngineです

<img width="596" alt="スクリーンショット 2016-01-04 0.05.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/21321/d8cc6f70-ab54-8fcf-26cb-4c8fc57ab29b.png">


# まとめ :metal:

簡単に限定機能を用意することができました。
もちろん、Google Analytics などで集計したいとか、CSSはどうするの？とか考えることはまだまだありそうです。実際に試してみたら、続きを書いてみようと思います。