kansiho's memo

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

[つくれぽ]使用しているパーシャルテンプレートをビューに表示してくれるgemをつくりました

初めてgemを作りました。

公開1日で300人のダウンロードがあり、なかなか達成感がありました。

とても簡単なので、是非是非railsユーザでgemを作ったことのない方は試して見てください。

作ったgemは、current_template という、現在表示しているテンプレートを取得して、ビューに表示するというシンプルなものです。所要時間は30分程度でした。

<%= show_current_template %>

というヘルパーをlayout/application.html.erbに加えると、全てのページでログを見ることなく、ぱっと使っているパーシャルのファイル名がわかります。

大規模開発で、Bug fix 担当であちこち見て回らなきゃいけないときに便利です。

https://github.com/shihokambara/current_template/raw/master/screenshot.gif

github.com

上からダウンロードできるのでぜひ試してみてください。

今回は、Railsで利用するヘルパーとパーシャルテンプレートを作るという想定でgemの作り方をまとめたいと思います。

gemのつくりかた

流れは、

ローカルで作成 

自分のrailsアプリで読み込んで使い勝手をチェック

githubにpush

rubygems.orgにユーザー登録

ローカルからコマンド一発で公開

という感じです。

今回は、railsのプラグインとして使うgemを作ることを想定しています。なので、

rails plugin new some_gem_name --mountable

コマンドを打つところからから始めましょう。

mountableオプションをつけることで、railsエンジンとしてgemが機能します(参考コード: Search · mountable · GitHub

% rails plugin new sample --mountable

      create  README.md
      create  Rakefile
      create  sample.gemspec
      create  MIT-LICENSE
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/sample/application_controller.rb
      create  app/helpers/sample/application_helper.rb
      create  app/jobs/sample/application_job.rb
      create  app/mailers/sample/application_mailer.rb
      create  app/models/sample/application_record.rb
      create  app/views/layouts/sample/application.html.erb
      create  app/assets/images/sample
      create  app/assets/images/sample/.keep
      create  config/routes.rb
      create  lib/sample.rb
      create  lib/tasks/sample_tasks.rake
      create  lib/sample/version.rb
      create  lib/sample/engine.rb
      create  app/assets/config/sample_manifest.js
      create  app/assets/stylesheets/sample/application.css
      create  app/assets/javascripts/sample/application.js
      create  bin/rails
      create  test/test_helper.rb
      create  test/sample_test.rb
      append  Rakefile
      create  test/integration/navigation_test.rb
      vendor_app  test/dummy

このように基本的なファイルが作成されます。多くて嫌になりますね。

sample.gemspec

sample.gemspecはgemの設定ファイルで、ここで書いた項目がrubygem.orgに登録した時に表示されます。

最初はこうなっています。TODOの表記があるところは必ず編集しましょう。

$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "sample/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "sample"
  s.version     = Sample::VERSION
  s.authors     = [“kansiho”]
  s.email       = [“shihodesu@gmail.com”]
  s.homepage    = "TODO"
  s.summary     = "TODO: Summary of Sample."
  s.description = "TODO: Description of Sample."
  s.license     = "MIT"

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"]

  s.add_dependency "rails", "~> 5.1.2"
  s.add_development_dependency "sqlite3"
end

それではヘルパーとビューを作成しましょう!

app/helpers/sample/view_helper.rb

今回は、<%= show_sample_template %>というヘルパーで用意したパーシャルテンプレートを表示することにします。

その場合こうなります↓

module Sample
  module ViewHelper
    def show_sample_template
      render partial: 'sample/show_template'
    end
  end
end

さて、ヘルパーメソッドができたので、次はrender partial: 'sample/show_template'で呼び出す本体を書きます。

app/view/sample/_show_template.html.erb

レンダーするビューを書きます。

gem ‘current_template’ の場合は、tailコマンドでログファイルの内容を取ってきて、正規表現でログからテンプレートに関するものを取り出して、Viewに表示しています(オープンクラスなどをあまりしたくなかったので、このような方式にしてみました)。

こんな感じになっています(例)↓

  Template: <%= "#{`tail log/development.log`}".scan(/\s[a-z]+\/\S+[erb|haml|slim]\s/) %>

好きな内容を書いてください。Hello worldなど。。。

lib/sample/engine.rb

次に lib/sample/engine.rb を編集します。作成したヘルパーを読み込むためです。

module Sample
  class Engine < ::Rails::Engine
     # 以下、書き足したところ
    initializer 'sample.action_view_helpers' do
      ActiveSupport.on_load :action_view do
        include ViewHelper
      end
    end
  end
end

これで完成です!テストは省略します(RSpecで書いてbundle exec rspecでテストします。書かなくても公開はできます)。

ローカルで試してみる

ローカルなgemは

gem "gemname", :path => "~/some/local/path" 

とpathを指定することで試すことができます。

自分の適当なRailsプロジェクトで使ってみます。

パッケージングする

%rake build

コマンドを叩くと、作成したファイルが

sample-0.1.0.gem

としてパッケージングされます。

rubygems.org に公開

Sign up | RubyGems.org | your community gem hostからrubygems.orgにデベロッパー登録します。

api token をローカルマシンに設置します。以下を実行してください

$ curl -u myname https://rubygems.org/api/v1/api_key.yaml >
~/.gem/credentials; chmod 0600 ~/.gem/credentials

Enter host password for user 'myname':

詳しくは

Make your own gem - RubyGems Guides

そしてgithubにpush してから、

% rake release

コマンドで公開できます!