Railsプロジェクトの新規作成の手順メモ
はじめに
Railsでの新規アプリ作成の手順をまとめた。
開発環境
- MacOS
- bundler
- Ruby on Rails
- Github
- Heroku
前提
ローカルへRailsのインストール
まずは、以下のコマンドを実行して「Gemfile」を作成します。 詳細はbundlerの使い方でも紹介していますので、詳細を知りたい方はそちらを合わせてご覧ください。 今回は、作成手順のみを中心に書いていきます。
$ mkdr testapp #testappディレクトリの作成 $ cd testapp #testappへの移動 $ pwd #移動できたかの確認 $ bundle init #gemfileの作成
bundle init
で作成されたgemfile内の# gem "rails"
のコメントアウトを外します。
# frozen_string_literal: true source "https://rubygems.org" gem "rails" ←ここの#を削除します。
これで、testappディレクトリ内に「Ruby on rails」をインストールする準備ができましたので、以下のコマンドを実行します。
$ bundle install --path vendor/bundle
ここまでで作成されたディレクトリ 「testapp」の中に 「.bundle/config」 「vendor/bundle」 「Gemfile」 「Gemfile.lock」
ただしこの時点では、まだウェブアプリの骨組みを構築するためのGem「Rails」を用意したにすぎません。ここから、あらためて新規Railsプロジェクトを作成していきます。
新規のRailsプロジェクトの作成
$ bundle exec rails new . -B -d mysql #現dirにmysqlで新規作成 $ bundle exec rails s
Railsのインストール実行時にGemfileを上書きしていいか聞かれますので「yes」にして続行します。これにより、Railsプロジェクトが新規作成されましたので、以下のようにGemfileを編集します(以下はあくまで参考です)。
source 'https://rubygems.org' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" end gem 'rails', '~> 5.0.1' gem 'mysql2', '>= 0.3.18', '< 0.5' gem 'puma', '~> 3.0’ gem 'sass-rails', '~> 5.0' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.2' gem 'jquery-rails' gem 'turbolinks', '~> 5' gem 'jbuilder', '~> 2.5' gem 'tzinfo-data' gem 'devise' gem 'haml-rails' gem 'erb2haml' gem 'font-awesome-rails' gem 'font-awesome-sass' gem 'carrierwave' gem 'mini_magick' gem 'rails-i18n' gem 'kaminari' gem 'autoprefixer-rails' gem 'gretel' gem 'sdoc', '~> 0.4.0', group: :doc gem 'dropzonejs-rails' gem 'fog-aws' gem 'payjp' gem 'enum_help' gem 'omniauth-facebook' gem 'omniauth-twitter' gem 'omniauth-google-oauth2' gem 'omniauth-instagram' gem "recaptcha" group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'capybara', '~> 2.13' gem 'selenium-webdriver' gem 'factory_bot_rails' gem 'capistrano' gem 'capistrano-rbenv' gem 'capistrano-bundler' gem 'capistrano-rails' gem 'capistrano3-unicorn' gem 'factory_girl_rails', "~> 4.4.1" gem 'faker' gem 'pry-rails' gem 'rails-controller-testing' gem 'rspec-rails' end group :development do gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' gem 'rubocop', require: false gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' gem 'browser_sync_rails' gem 'bullet' end group :test do end group :production do gem 'unicorn' end
Gemfileへの記述が完了したらbundle update
でGemをインストールしていきます(既にgemfile.lockが作成されているので)
$ bundle update --path vendor/bundle
もしくは、一度「gemfile.lock」を削除してbundle install
でもオッケーです。
ここまでで、一旦は新規プロジェクトの作成準備ができました。
Githubへプッシュ
編集が完了したら、Githubの管理下におきましょう。Githubへの登録は完了している前提で進めていきます。
またここで「.gitignore」を編集しておくことをお勧めします。(参考ページ)
$ git init $ git add . $ git commit -m "first commit" $ git remote add origin https://github.com/username/appname.git $ git push -u origin master
上のコマンド内の「username」にはgithubのユーザーネームを、「appname」はプロジェクト名を入れます。
herokuでデプロイ
herokuでデプロイを行います(こちらもインストールや登録は完了している前提で進めていきます)。
まずはherokuがインストールできていることを確認し、ログインします。
$ heroku —version #バージョンが表示されればOK $ heroku login --interactive heroku: Enter your login credentials Email [hogehoge@gmail.com]: #emailが表示→enter Password: ******************** #herokuのパスワード入力 Logged in as hogehoge@gmail.com
次に、SSHキーを追加します。
$ heroku keys:add Uploading /Users/Username/.ssh/ssh_key_file_name.pub SSH key... done
以下のコマンドでherokuサーバーにアプリケーションの実行場所を作成できます。
$ heroku create Creating app... done, ⬢ stormy-sands-10745 https://stormy-sands-10745.herokuapp.com/ | https://git.heroku.com/stormy-sands-10745.git
上の表示が出れば、無事herokuでのサブドメインが作成されました。なお、上の「stormy-sands-10745」部分はheroku側が自動設定したサブドメインで、その時によって変わります。
ではherokuにデプロイします。まずGitを使ってherokuにリポジトリをプッシュします。
$ git push heroku maseter
herokuへの反映の基本的動作はこれでOKです。
ただし、ここでエラーが出まくる可能性が高いです。落ち着いて対処して下さい(私がこの記事を書く際に出くわしたエラーの対処方法については下に記載しておりますのでご参考まで)
エラーを対処しherokuへのデプロイが無事完了したら、herokuが設定したサブドメインのURLにアクセスしてください。(上記例ではhttps://stormy-sands-10745.herokuapp.com/
です。これは当然、作成度に異なりますので、ご自身のドメインにアクセスして下さい)
アプリ画面が表示されればデプロイ完了です。
herokuのドメイン変更
初期のドメインはherokuが自動で設定したものです。このままでも構いませんが、アプリ名やドメインを変更したいと思う方も多いでしょう。その場合は以下のコマンドで変更できます。
なお、以下のNEW_NAMEの所に任意のアプリ名を入れて下さい。
$ heroku rename NEW_NAME Renaming stormy-sands-10745 to NEW_NAME… done https://NEW_NAME.herokuapp.com/ | https://git.heroku.com/NEW_NAME.git Git remote heroku updated ▸ Don't forget to update git remotes for all other local checkouts of the app.
これでお好みのアプリ名に変更でき、合わせてドメインも変更されました。
herokuデプロイのエラー対応
今回herokuでのデプロイを進める上で起こったエラーの対処を記録します。
私の場合、今回はプロジェクトを途中まで作成した段階でデプロイしたので、作成中プロジェクトに由来するエラーも多かった(新規作成してすぐでは発生しないはず)のですが、あくまでご参考として。
尚、herokuに関するエラーの対処法については、heroku公式サイトのRailsサポートページに記載がありますのでご参考ください。
(エラー)Precompiling assets failed.
最初に$ git push heroic master
した時に発生しました。
$ git push heroku master Enumerating objects: 383, done. Counting objects: 100% (383/383), done. ・・・(省略)・・・ remote: ! remote: ! Precompiling assets failed. remote: ! ・・・(省略)・・・ ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/NEW_APPNAME.git'
Precompiling assets failed.
と出ています。アセットファイルがプリコンパイルができません、とのことです。
<補足>
CSSやJavaScriptファイル、画像ファイルをコンパイル(機械語への翻訳)しやすいように、圧縮や連結をする処理をプリコンパイルと言い、そのためのフレームワークをアセットパイプラインと言います。
Railsアプリの
~/app/assets
の中にあるimages
やstylesheets
が、アセットパイプラインの部品であるアセットファイルです。
この対応についてはherokuの公式サイトにある通り、config/application.rb
ファイルに、以下のように追記します。
module NEW_APP_NAME class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. ・・・(省略)・・・ config.generators.system_tests = nil config.assets.initialize_on_precompile = false #この行を追加 end end
この記述は、コンパイル時にアプリケーションが初期化されるのを防ぐという設定ですが、Rails3まではこれを記述しないとプリコンパイル時にエラーが出るとのこと(Rails4以降は記述不要とのこと)
また、通常、本番環境にデプロイする際は、アセットパイプラインの処理機能によりassets内のファイルが圧縮・統合(プリコンパイル)されている必要がありますが、これは自動では行われません。
なので、以下のコマンドにより手動でプリコンパイルしてあげます。
$ RAILS_ENV=production bundle exec rake assets:precompile
ここまで完了したら、必ずgitにコミットしましょう。
(エラー)No Procfile detected,...
次は以下のエラーが出ました。
・・・(省略)・・・ remote: ###### WARNING: remote: remote: No Procfile detected, using the default web server. remote: We recommend explicitly declaring how to boot your server process via a Procfile. remote: https://devcenter.heroku.com/articles/ruby-default-web-server ・・・(省略)・・・
「Procfile」がないので、Procfileを使ってサーバーの起動方法を書くように、とのこと。
Procfileとはherokuでのサーバーの起動設定や、起動時に実行したいコマンドを記述するファイルです。
Ruby並びにRailsなどのフレームワークでは、デフォルトの開発環境用サーバーとしてWEBrickが設定されています。このWEBrickは開発には適していますが、本番環境で必要な並列処理ができません。
なので、並列処理を可能にするた目の別のWebサーバを利用する必要があります。今回はwebサーバーとしてpuma
を利用していきます。
gemfileにpumaがあるかを確認し、なければ記述します(バージョンは任意)。
gem 'puma', '~> 3.11'
次に、プロジェクトディレクトリ内に、Prockfileを作成します。
以下のコマンドでProckfileを生成しつつ、ファイル書き込みモードを起動します。
$ vim Procfile
ファイルが生成され書き込みモードになったら、キーボードの「I」を押して挿入モードに切り替え、以下を記述します。
$ web: bundle exec puma -C config/puma.rb
書き込み完了したら「esc」→「:wq」→「enter」で保存します。
次に、config/puma.rb
ファイルを編集します。rails5系であれば、設定ファイル自体は最初から存在しています(ない場合は作成する必要があります)。
config/puma.rb
ファイル内に下記コード文がコメントアウトされていますので、これをを外します。
workers ENV.fetch("WEB_CONCURRENCY") { 2 } preload_app! on_worker_boot do ActiveRecord::Base.establish_connection if defined?(ActiveRecord) end
あとはgithubへコミットしデプロイして確認します。デプロイ時にエラーメッセージが表示されなくなっていればオッケーです。
(エラー)Devise.secret_key was not set...
再度、デプロイコマンドを打つと、次のエラー出ました。
$git push heroku master ・・・(省略)・・・ remote: Running: rake assets:precompile remote: rake aborted! remote: Devise.secret_key was not set. Please add the following to your Devise initializer: remote: remote: config.secret_key = 'f3f2cbc***********’ remote:
これは、私が立ち上げたプロジェクトにユーザーログイン認証用のgem「Devise」が導入されており、そのsecret_keyが未設定のために起こったエラーです。
config/initializers/devise.rb
ファイルの適当なところに、エラー文に出ていたconfig.secret_key=…
をコピペしてあげればokです。
Devise.setup do |config| # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing config.secret_key = 'f3f2cbc***********’ #コピペする end
これだけでokです。
白い画面に「An unhandled lowlevel error occurred. .」
改めてデプロイしてみます。
$ git push heroku master $ heroku open
$ heroku open
はherokuでデップロイしたアプリをブラウザで開くコマンドです。ブラウザにURLをコピペする手間が省けます。
ブラウザが開くと、白い画面に「An unhandled lowlevel error occurred. The application logs may have details.」とだけ表示されました。
原因を調べるため、以下のコマンドでログを表示してエラー個所を確認。
$ heroku logs ・・・(省略)・・・ 2019-07-04T07:24:03.529018+00:00 app[web.1]: #<RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`>
「secrets.ymlファイルのsecret_key_baseが見つからない」とのことです。しかしsecrets.ymlはgithubには載せたくないです。
(secret.ymlにはAWSの秘密鍵コードなどを記載するので、うっかり載せると他人に悪用される可能性もあります)
なのでgemfile
に以下を記載した。
gem 'heroku_secrets', github: 'alexpeattie/heroku_secrets'
これは、secrets.ymlファイルをgitに置かずにherokuに送るためのgemです。
$ bundle install
でインストールできたら、以下のコマンドを実行します。
$ bundle exec rake heroku:secrets[APP_NAME] RAILS_ENV=production
これで、okです。
(エラー)Can't connect to local MySQL server…mysql.sock' (2)):
$heroku open
しても白い画面のままなので$heroku log
で確認します。
$ heroku logs ・・・(省略)・・・ ActionView::Template::Error (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):
MySQL関連のエラーです。ちなみにHerokuのDBはデフォルトでPostgreSQL になっていますが、私はMySQLを使っているのでMySQL関連のエラーが発生しました。
HerokuでMySQLを使うには、アドオンの追加が必要です。Herokuの公式サイトによると、ClearDBとJawsDBが使えるようですが、今回はClearDB を使います。
また、HerokuでMySQLを使用するためにはクレジットカードの登録が必要です(登録のみでオッケー。ライトプランであれば無料で利用できます)
こちらから設定しましょう。
以下のコマンドでアドオンを追加します。
$ heroku addons:create cleardb:ignite Creating cleardb:ignite on ⬢ APP_NAME… free ・・・(省略)・・・
アドオンが追加できたら、dbのURLを確認します。
Herokuではconfig/databse.ymlは環境変数から自動で作成されるとのこと。
以下のコマンドで、Herokuサーバーでの環境変数を確認します。
$ heroku config CLEARDB_DATABASE_URL: mysql://<username>:<password>@<host>/<database>?reconnect=true DATABASE_URL: postgres://<username>:<password>@<host>:<port>/<database> HEROKU_POSTGRESQL_TEAL_URL: postgres://<username>:<password>@<host>:<port>/<database> LANG: en_US.UTF-8 RACK_ENV: production RAILS_ENV: production SECRET_KEY_BASE: ...
上のコマンドで表示された’DATABASE_URL’が現在設定されているデータベースのURLです。
デフォルトでPostgreSQLの接続設定になっているので、これをCLEARDB_DATABASE_URLに設定されているMySQLの接続設定に置き換えます。さらに、mysql2ライブラリを使っているので先頭のmysql://をmysql2://に修正する必要があります。
以下のコマンドで実行します。
$ heroku config:set DATABASE_URL=‘mysql2://ba0fd5… #上のURLをmysql2に書き換えたものをコピペ $ heroku config #変更されたか確認
ついでに、タイムゾーンと LANG の設定もしておきましょう。
$ heroku config:add TZ=Asia/Tokyo $ heroku config:add LANG=ja_JP.UTF-8
最後にマイグレーションを実行します。
$ heroku run rails db:create $ heroku run rails db:migrate $ heroku open
<補足>
heroku run
コマンドは、Herokuサーバー側でコマンドを実行するためのコマンドです。
これでできました。
最後に
今回は、Railsプロジェクトの新規作成の手順の説明でした。特にHerokuでのデプロイや毎回エラーが発生して最初は大変ですが、慣れてしまえば大したことないです。頑張りましょう。
参考サイト
ClearDB MySQL - Add-ons - Heroku Elements
関連ページ
後ほど追記します。