makoto's TECH

私の備忘録

【Rails】RSpecの導入

概要

RSpecとFactoryBotを使えるようにします。

メリット

テストを書いておくことによって、確実に動くことを確認しながら開発することができるため、開発効率を高めることができます。

作業

導入

RSpec

Gemfile

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails' # ここを追加
end

ターミナル

$ bundle
$ rails g rspec:install # RSpecに必要なディレクトリや設定ファイルの作成
$ rm -r ./test # Minitest用のディレクトリの削除

.rspecの編集

--require spec_helper
--format documentation # ここを追加

FactoryBot

Gemfile

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails' # ここを追加
end

ターミナル

$ bundle

spec/rails_helper.rbの編集

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods # ここを追加
end

テストでDeviseを使えるようにする

spec/support/controller_macros.rbの作成・編集

module ControllerMacros
  def login(user)
    @request.env["devise.mapping"] = Devise.mappings[:user]
    sign_in user
  end
end

spec/rails_helper.rbの編集

RSpec.configure do |config|
  Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }  # ここを追加
  config.include Devise::Test::ControllerHelpers, type: :controller # ここを追加
  config.include ControllerMacros, type: :controller # ここを追加
end

テストの実行

ターミナル

$ bundle exec rspec

所感

実際にどんなテストを書けば良いかは、以下の記事が参考になりました。

qiita.com

【Rails】HerokuにHTTPSでデプロイしDBにMySQL2を設定する

概要

RailsアプリをHerokuにHTTPSでデプロイし、MySQL2を使えるようにします。

Herokuとは

Webアプリケーションの開発から実行、運用までをクラウド上で完結できるサービス(PaaS)のひとつです。

IaaS、PaaS、SaaSの違いを整理して、クラウドサービスの特徴を知ろう | ニフクラ

HTTPSとは

暗号化したHTTP通信のことです。暗号化することによって、第三者からの盗聴・改竄・なりすましを防ぐことができます。暗号化にはSSL/TLSプロトコルを利用しています。

SSL/TLSってなんだろう?|SSL/TLS-総合解説サイト

MySQLとは

オープンソースで提供されているリレーショナルデータベースマネジメントシステム(RDBMS)のひとつです。

PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較! - エンジニアHub|若手Webエンジニアのキャリアを考える!

作業

Rails

各種設定

config/environments/production.rbの編集

config.force_ssl = true # コメントアウトを外す

config/puma.rbの作成・編集

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/
  # deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end

./Procfileの作成・編集

web: bundle exec puma -C config/puma.rb

Heroku

DBにMySQLを使用するためにはクレジットカードの登録が必要です。

Herokuのインストール

既にインストールしているの場合は不要です。

https://jp.heroku.com/

ターミナル

$ brew tap heroku/brew && brew install heroku # Herokuのインストール

ターミナル

To use the Heroku CLI's autocomplete --
  Via homebrew's shell completion:
    1) Follow homebrew's install instructions https://docs.brew.sh/Shell-Completion
        NOTE: For zsh, as the instructions mention, be sure compinit is autoloaded
              and called, either explicitly or via a framework like oh-my-zsh.
    2) Then run
      $ heroku autocomplete --refresh-cache

  OR

  Use our standalone setup:
    1) Run and follow the install steps:
      $ heroku autocomplete

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

このような画面が出ればインストールは完了です。

URLの作成

ターミナル

$ heroku login # Herokuにログイン
$ cd # デプロイしたいアプリのディレクトリに移動
$ heroku create <アプリ名> # URLの生成
Creating ⬢ <アプリ名>... done
https://<アプリ名>.herokuapp.com/ | https://git.heroku.com/<アプリ名>.git

使用するDBをMySQL2に設定

ターミナル

$ heroku addons:create cleardb:ignite # DBの追加
$ heroku config # Herokuの設定の確認
=== <アプリ名> Config Vars
CLEARDB_DATABASE_URL: mysql://〜
$ heroku config:set CLEARDB_DATABASE_URL=mysql2://〜 # CLEARDB_DATABASE_URLをmysqlからmysql2に変更
Setting CLEARDB_DATABASE_URL and restarting ⬢ <アプリ名>... done, v5
CLEARDB_DATABASE_URL: mysql2://〜

使用するDBをPostgreSQLからMySQL2に変更

ターミナル

$ heroku addons:destroy heroku-postgresql -a <アプリ名> # postgresqlを削除
 ▸    WARNING: Destructive Action
 ▸    This command will affect the app <アプリ名>
 ▸    To proceed, type <アプリ名> or re-run this command with --confirm <アプリ名>

> <アプリ名> # 削除には入力が求められるので入力
Destroying postgresql-triangular-69120 on ⬢ <アプリ名>... done
$ heroku config:set DATABASE_URL=mysql2://〜 # DATABASE_URLにmysql2を設定

Herokuへデプロイ

ターミナル

$ git push heroku master

参考

railstutorial.jp

qiita.com

qiita.com

所感

PostgreSQLからMySQLに変更したら、サイトの読み込みが早くなった気がします。

【Rails】日付・時刻のフォーマットの変更

概要

f:id:mako_to_ex:20190305174214p:plain

これを、、、

f:id:mako_to_ex:20190305175324p:plain

こうします。

作業

config/initializers/time_formats.rbを作成・編集します。

Time::DATE_FORMATS[:default] = '%Y/%m/%d %H:%M'

そして、サーバーを再起動します。

他の方法

strftimeでも日付・時刻のフォーマットを変更することができますが、 この場合は、変更したい全ての場所でstrftimeを使う必要があります。

irb(main):001:0> Time.now.strftime('%Y/%m/%d %H:%M')
=> "2019/03/05 17:57"

参考

qiita.com

strftime - リファレンス - - Railsドキュメント

【Rails】Deviseのエラーメッセージの個別表示

概要

f:id:mako_to_ex:20190228162801p:plain これを、、、

f:id:mako_to_ex:20190228162823p:plain こうします。

作業

app/views/devise/new.html.erb

<%= devise_error_messages! %>

これを削除します。

app/views/devise/new.html.erb

<div class="field">
  <%= f.label :email %>
  <%= f.email_field :email, autocomplete: "email" %>
  <% resource.errors.full_messages_for(:email).each do |message| %>
    <div class="red-text center">
      <%= message %>
    </div>
  <% end %>
</div>

このようにそれぞれの入力フォームを編集します。

番外編

このままだとエラーが発生した時にレイアウトが崩れてしまいます。。。

config/application.rb

config.action_view.field_error_proc = Proc.new do |html_tag, instance|
  %Q(#{html_tag}).html_safe
end

これを追加します。

参考

blog.naichilab.com

所感

個別に表示させようとする前は、エラーメッセージのレイアウトを変更しようとしてました。

その時には、以下の記事が参考になりました。

qiita.com

Rubocopによるコードレビュー

概要

Rubocopを使用してコードのスタイリングをチェックします。

作業

導入

Gemfile

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'rubocop', require: false #ここを追加
end

ターミナル

$ bundle

設定

.rubocop.ymlを作成

AllCops:
  Exclude:
    - bin/*
    - db/schema.rb
    - node_modules/**/*
    - db/migrate/*
    - vendor/**/*
  Rails:
    enabled: true

Style/Documentation:
  Enabled: false

Style/StringLiterals:
  Enabled: false

Metrics/LineLength:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: false

実行

ターミナル

$ bundle exec robocop
$ bundle exec rubocop --auto-gen-config

修正

ターミナル

$ bundle exec rubocop -a # Cop supports --auto-correct.があれば実行可能

具体的な修正内容は以下を参照 github.com

所感

コードレビューツールを使うことによって、コーディングのクセのようなものを修正、コードを統一することで読みやすくすることができると思います。また、逆に可読性を下げるようなものもあったため、自動修正後には変更点を確認した方が良いと思いました。次回、設定するときには、可読性を下げるような項目の除外を検討すると良いかもしれないと思いました。