AdventCalender20日目、担当の望月です。
現在受託会社で主にサーバーサイドのエンジニアやりつつ、たまーにTECH::CAMPにも顔出してます。
##何を書くのか
Railsで新しいアプリケーションを作るときって、rails new から初めて、ごにょごにょと決まった作業をしていきますよね?
でも、僕は問いたいです。
**「その作業、無駄じゃないですか?」**と。
同じ処理は2回繰り返さない というDRYの原則のもと、どうせ毎回同じ作業(日本語に直して、DB作って、gem入れて...etc)するなら、いっそテンプレ化しちゃおうよ。 というのが今回の趣旨となります。
なので本記事では、新しくアプリを作り始める際に「これは毎回やるなー」ってことを雛形として作成してみましたので、その使用手順をまとめていきたいと思います。
ゴール
コマンドを数本打つだけで2~3時間分の初期設定が済んだファイルをローカルに持ってきて、
開発スタート時の「前の開発でもやったわ、めんどくさー」っていう作業を無くしたいと思います。
(打つべきコマンド一覧は記事下部に記載してます)
頭を使わない作業は極力簡略化して、是非開発にスタートダッシュをかけてください!
各種ファイルの設定
今回の雛形ファイルには、素のrails newをした初期設定に加えて、下記のような設定が施されています。
環境別ファイルの設定
config/enviropments/development.rbを下記のように変更してあります。
config.action_mailer.raise_delivery_errors = true #falseをtrueに変更
config.action_mailer.default_url_options = { host: 'localhost:3000' } #付け足し
これで、ActionMailerのエラー表示設定 & deviseの初期設定を行っています。
アプリケーション本体に関する設定
config/locals/application.rbに、下記を追加しましょう。
config.generators do |g|
g.test_framework nil
g.assets false
g.helper false
g.stylesheets false
end
こちらでrails generateをした際に、テストファイルやhelperファイルなどが同時生成されることを防ぎます(もちろん、必要な場合は適宜設定を変更してください。)
また、同ファイルの下記も変更しておきましょう。
config.i18n.default_locale = :ja
config.time_zone = 'Tokyo'
こちらで、言語設定を日本語に、時刻を東京基準に変更しております。
Flashの設定
application.html.erbの、
タグ開始直後、<%= yield %> 上部に、下記を追記しました。 <% flash.each do |key, value| %>
<% key = "info" if key == "notice" %>
<% key = "danger" if key == "alert" %>
<%= content_tag :div, value, class: "alert alert-#{key}" %>
<% end %>
また、bootstrap用のkeyを許可するために、application_controllerに下記を追記しています。
add_flash_types :success, :info, :warning, :danger
これでbootstrapのkeyでflashメッセージが送られたら、とりあえず表示されるようにはなりました。
Gemの設定
効率化に欠かせないのは、何と言ってもgemです。
車輪の再発明という言葉があるように、一度誰かが作ったものをもう一度作り直すなんてことはナンセンスですよね。
ですので、多くのアプリで必要とされ、なおかつgemで提供されている機能に関しては、積極的に取り入れるようにしています。
では、そのGemの一覧、Gemfileを見てみましょう。
gem 'rails', '4.2.6' #バージョン指定は適宜変更
gem 'turbolinks' #Railsのページ遷移高速化のためのgem
gem 'sdoc', group: :doc # Rubyのソースを読み取り、ブラウザで閲覧しやすいドキュメントを生成してくれる
gem 'haml-rails' #hamlが使えるように
gem 'therubyracer'
# UI/UX
gem 'jquery-rails'
gem 'coffee-rails'
gem 'bootstrap-sass' #bootstrap導入
gem 'font-awesome-rails' #アイコンタグを挿入するヘルパーメソッドを提供
gem 'uglifier' #JSのコード軽量化ライブラリ。UglifyJS2をrubyで使えるようにしたもの
gem 'sass-rails'
gem 'jbuilder'
gem 'wareki' #元号表示(平成や昭和など)に対応。案外使える
# ユーザー機能
gem 'devise' #ユーザー機能導入
gem 'devise-i18n' #devise日本語化
# gem 'bcrypt' #パスワード暗号化機能を提供してくれる。 本番に上げる際はコメントアウトを外す。
# 役割定義
gem 'cancancan' #役割別に出来ること、出来ないことを定義できる。
# 各種ファイル設定用
gem 'dotenv-rails' #ドットファイルの定義用
gem 'config' #定数定義用
gem 'enum_help' #enumの日本語化
# データベース
gem 'mysql2', '~> 0.3.18' #バージョン指定は適宜変更
# seed用
gem 'seed-fu'
# 検索機能
gem 'ransack'
# ページネーション
gem 'kaminari'
# パンくず
gem 'gretel'
# アップロード用
gem 'carrierwave'
gem 'mini_magick' #画像リサイズ用のgem
gem 'fog'
# フォーム
gem 'bootstrap_form'
# 論理削除
gem 'paranoia'
# Model拡張
gem 'active_hash'
# 管理画面
gem 'adminlte2-rails'
# サーバー
# gem 'unicorn' 実際にunicornを使う際はコメントアウトを外す
group :development, :test do
# デバッグ用
gem 'byebug'
gem 'better_errors'
gem 'pry'
gem 'pry-byebug'
gem 'pry-doc'
gem 'pry-rails'
gem 'pry-stack_explorer'
gem 'hirb'
gem 'awesome_print'
gem 'letter_opener' #メール送信機能をローカルで試すためのgem
gem 'web-console', '~> 2.0'
# CLI
gem 'spring'
# Table/Scheme
gem 'annotate' #schemaをモデルに書き出してくれる
# デプロイ
# gem 'capistrano' #自動デプロイ用 デプロイ時に使用する際はコメントアウトを外す
end
デフォルト外のものや、何に使ってるか分かりづらそうなものにはコメントを入れてあります。
gem別の設定ファイル
gemによっては、指定のディレクトリに指定の名前でファイルを用意しないと使えない...なんてこともあります。
ですが、こちらも雛形に組み込み済です。
皆さんは下の説明をみながら、「どのファイルがどのgem設定用のファイルなのか」をしっかりと認識した上でご使用ください。
bootstrap-rails
今回はsassで導入しましたので、それに沿ってファイルを編集していきます。
手順は...
1.元々あるapplication.cssを、application.scssにリネーム
2.その中身を全部消す
3.新たに
@import "bootstrap-sprockets";
@import "bootstrap";
を記述。この記述によってbootstrapが読み込まれる。
4.application.jsに
//= require jquery
//= require bootstrap-sprockets
を追加。
以上4工程です。
また、lessの場合の導入などは、こちらが参考になるのでよろしければ。
font-awesome-rails
application.scssにこちらを追加
@import "font-awesome";
詳しくはこちらを参照
RailsにFont Awesomeを導入するGem
Rails に font-awesome-rails を入れて Awesome Font を使う
devise
1.まずはデバイスの導入から。こちらのコマンドでインストール。
$ rails g devise:install
initializeのファイル等々が生成されます。
2.続いてviewファイルもインストールしときましょう。(ココらへんは好きなものを入れればOKです)
$ rails g devise:views
ここから先は共通部分ではないので工程としては省きますが、
devise絡みのモデルを作成したい場合は、
$ rails g devise user(任意のモデル名)
としてあげればOKです!
詳しくはこちらを参照。
Deviseの設定手順をまとめてみた。 その1 導入編
devise-i18n
gem独自に設定することは無いのですが、1点だけ。
localeの設定を日本語に変更しておきましょう!(今回の雛形では既に設定済です。)
deviseを日本語化する
cancancan
使用前にコマンドを一つ叩いておきましょう。
$ rails g cancan:ability
こうすることで、model配下に
class Ability
include CanCan::Ability
def initialize(user)
end
end
というファイルが生成されます。
そしてこのファイルにユーザー権限やアクセス制限等について書いていき、その辺りの管理を一元化していきましょう。というgemになります。
使い方に結構癖があったので、このあたりを見ながら勉強していってください。
dotenv
アプリケーションのルートディレクトリで、一つコマンドを叩いておきましょう。
$ touch .env
これを行うことで、.envというファイルがルートディレクトリに作成されます。
あとは、この中にアプリケーションで使用する環境変数を書いていけばいいだけ。非常に楽ちんです。
間違ってもこの.env自体をgitにpushするなんてことの無いように。。。
(clone後は、.gitignoreに追加するなどして二度とプッシュしないようにしてくださいw)
環境によって変わる設定値はdotenvを使うと便利
config
設定ファイルインストールの為のコマンドを一つ叩きましょう。
$ bundle exec rails g config:install
このコマンド一つで、
config/settings.yml #全ての環境のYAML
config/settings.local.yml #ローカル環境専用のYAML
config/settings/development.yml #開発環境専用のYAML
config/settings/test.yml #テスト環境専用のYAML
config/settings/production.yml #本番環境専用のYAML
これらのファイルが追加されるとともに、.gitignoreなどにも追記がされます。
記述方法なども合わせてこちらに詳しい解説が載っております。
enum_help
特に無いです! locals/ja.ymlというところに日本語訳をまとめて書いていって、決まった呼び出し方をすれば日本語で表示されます。便利!
呼び出し方等は以下でご確認を。
【Rails】enumをI18n対応させるenum_helpが便利すぎた
seed_fu
ファイル配置用のディレクトリだけ先に作ってしまいましょう。
$ mkdir db/fixtures
$ mkdir db/fixtures/development
$ mkdir db/fixtures/production
どのように初期データを投入するかに関しては、こちらをお読みください。
railsで初期データを入れる(seed-fuの使い方)
ransack
検索用のgemですね。
初期設定は特に必要ないです。
使い方はこちらを参照。
Railsでransackを使って検索機能を作成する
kaminari
まずはこのコマンドを叩きましょう。
rails g kaminari:config
こちらでkaminari設定ファイルが作成されます。
また、ページネーションのデザインをbootstrapっぽくしたいのであれば、下記コマンドを叩きましょう。
rails g kaminari:views bootstrap3
bootstrap3以外にも色々と選択肢があるみたいです。
設定など詳しくは下記から。
Railsでkaminariを使ってページネーションを実現する
gretel
こちらのコマンドを叩きましょう。
$ rails g gretel:install
これにより、config/breadcrumb.rbというファイルが生成されます。
ここに、パンくずリストを一元化していきましょう。
詳しくはこちら。
パンくずリストを出す Gretel Gem が使いやすくて感動した
carrierwave / mini_magick / fog
これらは実際にアップロードを行う際に個別の設定を記述していくので、初期段階では特に設定する必要はありません。
(fogはS3に画像をアップロードする際に必要です)
設定が必要になったタイミングで、下記記事らを参考にしてみてください。
Rails 4.1 で CarrierWave を使う
Fog + carrierwaveでAWS S3に画像をアップロード
bootstrap_form
application.scssに、下記を記述しましょう。
@import "rails_bootstrap_forms"
これで、bootstrap_form_forあるいはbootstrap_form_tagという記述が使えるようになります。
では、この記述を使うことで何が出来るのか...
それは、公式のReadmeが一番詳しかったので、載せておきますね。
bootstrap-ruby/rails-bootstrap-forms
paranoia
なにもすることはありません。
論理削除を導入したいモデルに acts_as_paranoia と書き、 そのテーブルにdatetime型でdeleted_atというカラムを追加すればOKです。
Railsで論理削除をするacts_as_paranoidを試してみた
active_hash
こちらも必要が出たら設定しましょう。
静的データのモデル化にactive_hash gemが便利・・!
adminlte2-rails
管理画面のテンプレートエンジンですね。
とりあえず、root配下にadminコントローラーやviewを作ってしまいます。(ここは手順省略)
そして、viewファイルを手元に持ってくるために、下記コマンドを叩きましょう。
$ bundle exec rails g admin_lte2
こちらでviewやらCSSやらが一式手元にやってきます。
(マニュフェストファイル名がapplication.scssでないと上手く行かないようです。)
最後に、このテンプレートを使用するコントローラーに下記を記述しておきましょう。
layout 'admin_lte_2'
これで指定のコントローラーでadmin_lte_2のテンプレートが使えるようになりました。
pry系
pryの設定は、別途.pryrcというファイルで行います。
アプリケーションのルート階層に、下記を配置しておきましょう。
# hirbの設定
begin
require 'hirb'
rescue LoadError
# Missing goodies, bummer
end
# AwesomePrintの設定
begin
require "awesome_print"
Pry.config.print = proc { |output, value| output.puts value.ai }
rescue LoadError
puts "no awesome_print :("
end
if defined? Hirb
# Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
Hirb::View.instance_eval do
def enable_output_method
@output_method = true
@old_print = Pry.config.print
Pry.config.print = proc do |output, value|
Hirb::View.view_or_page_output(value) || @old_print.call(output, value)
end
end
def disable_output_method
Pry.config.print = @old_print
@output_method = nil
end
end
Hirb.enable
end
if defined?(PryByebug)
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'
Pry.commands.alias_command 'c', 'continue'
Pry.commands.alias_command 'bt', 'show-stack'
end
以上で各種gemの設定はおしまいです。
#最後に
さぁ。今まで様々な設定に関してあれこれと見てきましたが、
恐らくこの雛形をcloneしただけではrails gコマンドが動かないかと思います。
ですので、cloneしてbundle installしたら
$ spring stop
$ bin/spring
この2つのコマンドを叩いてあげてください。
こちらでアプリが正常に動くかと思います。
また、cloneしたままだと既にコミット先のレポジトリが指定されている状態なので、
rm -rf .git/
このコマンドでgitの管理から外しておきましょう。
(この後ご自身で開発してgit管理を行う場合は、通常通りの流れで大丈夫です。)
アプリの名前も変えておきましょう。
$ mv base_project ◯◯(新しいアプリ名)
これで変更されているかと思います。
DB名も変更します。
「base_project」 となっている箇所を、ご自身のアプリ名に変更
これでひとまずはオッケーです!
(細かいとこありそうなのですが、まだ試してないので分かったら教えてください。)
##まとめ
この雛形を使うために、打たなかれば行けないコマンドを、今一度まとめます。
$ git clone ~~~~(ご自身のレポジトリにひな形ファイルをご用意ください)
$ rm -rf .git/
$ mv base_project ◯◯(新しいアプリ名)
$ bundle exec bundle install
$ spring stop
$ bin/spring
$ bundle exec rake db:create
以上です。
簡単ですね。
「依存絡みでgemが入らない」とか「DBのソケットが違う」とか、環境によって諸々問題は出てくるかと思うので、初回は根気がいるかもですw
頑張ってください。
1点注意なのですが、必ずご自身のレポジトリに雛形を作ってください!
ご自身の使いやすい設定で雛形を作るのが一番かと思いますし、
誤って僕のレポジトリの上書き...なんてことになったら。。。 笑
では、クリスマスまであと4日!
皆さん、ハッピークリスマス♡