【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
所感
実際にどんなテストを書けば良いかは、以下の記事が参考になりました。
【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のインストール
既にインストールしているの場合は不要です。
ターミナル
$ 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
参考
所感
PostgreSQLからMySQLに変更したら、サイトの読み込みが早くなった気がします。
【Rails】日付・時刻のフォーマットの変更
概要
これを、、、
こうします。
作業
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"
参考
【Rails】Deviseのエラーメッセージの個別表示
概要
これを、、、
こうします。
作業
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
これを追加します。
参考
所感
個別に表示させようとする前は、エラーメッセージのレイアウトを変更しようとしてました。
その時には、以下の記事が参考になりました。
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
所感
コードレビューツールを使うことによって、コーディングのクセのようなものを修正、コードを統一することで読みやすくすることができると思います。また、逆に可読性を下げるようなものもあったため、自動修正後には変更点を確認した方が良いと思いました。次回、設定するときには、可読性を下げるような項目の除外を検討すると良いかもしれないと思いました。