Railsにおけるurlとpathの使い分け

こんにちは!kossyです!




本日気になったニュースはこちら
www.itmedia.co.jp

YouTuberを起用している点は非常にいいと思います。
知名度があるだけで信用度がないタレントさんだと
コケるような気がします。









さて、今回はurlとpathの使い分けについて
ブログに残してみたいと思います。




環境
Rails 5.2.1
Ruby 2.5.1
MacOS Mojave



使い分け

基本は以下で良さそうです。

・リダイレクトを伴うならurl
・それ以外はpath


実例を示すと、コントローラでリダイレクト先を指定する時にはurlで、
ビューでリンクを生成する時はpath



みたいな感じですね。
ただ、コーディング規約が定められているのであれば、そちらに従った方が無難でしょう。





参考にさせていただいた記事
_pathメソッドと_urlメソッドの使い分け - Qiita

開発環境で本番環境のエラー画面を出したい

こんにちは!kossyです!




さて、今回は開発環境で本番用のエラー画面を出したいときのやり方を
ブログに残してみたいと思います。



環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave




app/config/environments/development.rbの、

  # Show full error reports.
  config.consider_all_requests_local = true

ここの記述をfalseにすれば本番用のエラー画面を出力できます。



2020/09/17 追記

Ruby界隈で著名なプログラマーである@jnchitoさんが以下の記事を書かれていらっしゃいました。



う、、、完全にアンチパターン踏んどるやん、、、
と思ったので追記しております。

本番環境でエラーログを確認したい場合は、上記の記事で記載のあるやり方の他には
Airbrakeやrollbarといったエラー通知サービスを扱うのがいいのではないかと思います。

どちらも無料で使えるプランがありますので、
私のようにアンチパターンを踏まないようにするために、お試しで利用してみることを推奨します。

Github desktopにログインできない問題

こんにちは!kossyです!




最近これを買いました。
book.mynavi.jp

初歩的なことから現場を意識したことまで一貫して網羅されており、
今まで買ったRails関係の技術書の中で一番良いと思います。

残りのニート期間中にやりきります。










さて、今回はGithub desktopにログインできなくなるという事象に
遭遇してしまったので、解決策をブログに残してみたいと思います。

Github desktopからのアラート文

GitHub Desktop was unable to store the account token in the keychain. 
Please check you have unlocked access to the 'login' keychain. 

なんでアラートが出たのかわかりませんが、
これがないと開発にならないので、対応しました。

1. MacのFinderを開き、アプリケーションディレクトリのユーティリティの中にある、
「キーチェーンアクセス」を開く

2. 画面左側にある「ログイン」を右クリックし、「"キーチェーンログイン"をロック」をクリック

3. 再度ログインを右クリックし、ロックを解除する


この手順でアラートが出なくなりました。



参考にさせていただいた記事
GitHub for Desktopのエラー : とあるエンジニにゃーのblog

バリデーションヘルパー早見表

こんにちは!kossyです!




さて、今回はRailsにおいてDBに値を保存するときの検証に用いる
バリデーションヘルパーの早見表をブログに残したいと思います。




環境
Rails 5.2.1
Ruby 2.5.1
MacOS Mojave





バリデーションヘルパー早見表


・データが存在しているか

validates :name, presence: true

・数値がきちんと入っているか

validates :int, numericality: true

・(数値の)範囲が期待通りか

validates :int, inclusion: { in: 0..9 }

・文字列の長さが指定した数を上回っていないか

validates :name, length: { maximum: 30 }

・フォーマットに適合しているか

validates :email, format: { with: /\A[a-zA-Z0-9_\#!$%&`'*+\-{|}~^\/=?\.]+@[a-zA-Z0-9][a-zA-Z0-9\.-]+\z/}

・データが一意か

validates :name, uniqueness: true

・確認用のものと一致しているか

validates :password, confirmation: true

(備忘録)Docker用語まとめ

自分用Docker用語まとめです



MovyLinux
Dockerをインストールすると、自動で導入される、
軽量なLinuxマシン

コンテナ
実行環境を立ち上げた際にMovyLinux上に作成される仮想環境のこと

Docker Hub
作成したコンテナをクラウド上で共有できるサービス

イメージ
コンテナの元になるファイルをまとめたものの名前

Dockerfile
イメージの元になるコードを記述するところ
このファイルをbuildするとDcoker Image(コンテナ仮想環境の雛形が作成される)



ターミナルコマンド

docker-compose run web rails new . --force --database=mysql
Railsのコンテナ上で、rails new ~ を実行することを示すコマンド
コンテナ上の作業ディレクトリである/appディレクトリにプロジェクトファイルを作成する

    • force 既存ファイルを上書きするオプション
    • database=mysqlMySQLを使用するためのオプション

docker-compose build
作成されたファイルをコンテナ内に取り込むためのコマンド

docker-compose up -d
database.ymlに基づきコンテナを起動するコマンド

docker-compose ps
コンテナが起動しているかを確認

docker-compose run web bundle exec rake db:create
DBを作成

docker-compose stop
コンテナを停止させるコマンド

docker-compose down
コンテナを削除するコマンド

rm tmp/pids/server.pid
ctrl + c 等で強制終了した際に残ってしまうpidファイルを削除するコマンド

bundle installしたい場合
docker-compose build -> docker-compose up -d

attach状態から抜けたい時
ctrl + p q

docker-compose exec web rails db:seed
seedファイルに記載したデータを生成したいとき

partial: を記述しないとパーシャル先でローカル変数を使うときにエラー吐く

こんにちは!kossyです!




本日の気になったニュースはこちら
www.nhk.or.jp

最近暇なので情報収集のために月ー木まで毎日見ているのですが、
切り口が面白くて視聴が楽しみです。

今回の放送は終活に関してですが、
社会との繋がりを更に大事にして生きていこうと思いました、、、











さて、今回は一緒に使われがちなnew画面とedit画面のpartial時のエラーについて、
ブログに残してみたいと思います。




環境
Rails 5.0.7
Ruby 2.3.6
MacOS Mojave
Haml








状況

newアクションで表示する画面とeditで表示する画面がほとんど一緒で冗長なので、
_form.html.hamlとして共有したい

new.html.haml

.d-flex.align-items-center
  %h1 新規作成
  .ml-auto.boards__linkBox
    = link_to '一覧', root_path, class: 'btn btn-outline-dark'
= render 'shared/form', locals: { board: @board }



edit.html.haml

.d-flex.align-items-center
  %h1 編集
  .ml-auto.boards__linkBox
    = link_to '一覧', root_path, class: 'btn btn-outline-dark'
= render 'shared/form', locals: { board: @board }



_form.html.haml

= form_for board do |f|
  .form-group
    = f.label :name, '名前'
    = f.text_field :name, class: 'form-control'
  .form-group
    = f.label :title, 'タイトル'
    = f.text_field :title, class: 'form-control'
  .form-group
    = f.label :body, '本文'
    = f.text_area :body, class: 'form-control', rows: 10
  = f.submit '保存', class: 'btn btn-primary'

これでイケると思いましたが、ダメでした。

f:id:kossy-web-engineer:20181113225009p:plain


renderでローカル変数渡す時はpartial: を記載しないとダメっぽい

どうやら、

= render partial: 'shared/form', locals: { local: @local }

としないとエラーになるみたいです。
partial先を明示的に指定しないと、local変数がパーシャル先に渡らない仕様なんですかね、、、

ともあれ、上記のようにpartialを追記したら動くようになりました。

bootstrap4が適用されたkaminariのviewを作成したい

こんにちは!kossyです!





さて、今回はRailsでページネーションを実装する際にほぼ必ず用いられているgem 'kaminari'で
bootstrap4を当てたビューを生成する方法についてブログに残してみたいと思います。




環境
Rails 5.0.7
Ruby 2.3.6
MacOS Mojave




gemをインストールしてrails g kaminari:views bootstrap4を実行するだけ

見出しに書いたことで話は完結しちゃいます。笑


英語表記を日本語化する手順や、リンクの位置を中央寄せにしたいなどは、
rails 日本語化 とか
bootstrap4 中央寄せ
とかで検索してみてください。

NTTの方が作ったコンテナ技術入門がためになる

こんにちは!kossyです!





本日気になったニュースはこちら
headlines.yahoo.co.jp

紙の保険証は廃止してオンライン上で顔写真付きの保険証を発行したらいいんじゃないですかね。










さて、今回はTwitterで良さげなスライドがシェアされていたので、
ブログでも紹介したいと思います。

www.slideshare.net

Dockerとkubernetesについて、
中でどういう処理が行われているのか、使われている技術までカバーしています。
これコンテナ経験1ヶ月の方が書いたらしいです、、、
めちゃくちゃビックリしました笑

(手抜きエントリ)モデルのバリデーションのテストコードをRspecで書いてみた

こんにちは!kossyです!




本日のニュースでは無いですが、個人的に注目のニュースです。
jp.techcrunch.com

VoicyのIT公式ニュースでメドレー社の存在を知りました。

ヘルスケア業界に少しでも関わる自分にとっては、
技術をオープン化し、医療業界の無駄な部分を改善していきたいというビジョンには
共感を覚えます。

これからも動向を注視したいです。










さて、今回はRspecでバリデーションのテストコードを書いてみたので、
ブログに残してみたいと思います。



環境
Rails 5.1.6
Ruby 2.5.1
Rspec 3.8.0
MacOS Mojave





Userモデルのバリデーション

name, email, passwordカラムにバリデーションをかけています。

app/models/user.rb


  validates :name, presence: true, length: { maximum: 50 }
  validates :email, presence: true, uniqueness: true, format: {
    with: /\A[a-zA-Z0-9_\#!$%&`'*+\-{|}~^\/=?\.]+@[a-zA-Z0-9][a-zA-Z0-9\.-]+\z/
    }
  validates :password, presence: true, length: { minimum: 8 }, format: {
    with: /\A[a-z0-9]+\z/,
    message: 'は半角英数字で入力してください'
    }



user_spec.rbの記述

require 'rails_helper'

RSpec.describe User, type: :model do

  describe 'ユーザー作成のテスト' do
    context '名前・メールアドレス・パスワードがあれば有効な状態である場合' do
      it 'ユーザーは有効である' do
        user = User.new(
          name: 'test_user1',
          email: '12345678@gmail.com',
          password: 12345678,
          )
        expect(user).to be_valid
      end
    end
    describe 'validates :name, presence: true' do
      context '名前がnilの場合' do
        it 'ユーザーは無効である' do
          user = User.new(
            name: nil,
            email: '12345678@gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
      end
    end
    describe 'validates :name, length: { maximum: 50 }' do
      context '名前が50文字以上の場合' do
        it 'ユーザーは無効である' do
          user = User.new(
            name: 'abcdefghijklmnopqestuvwxyzabcdefghijklmnopqestuvwxyz',
            email: '12345678@gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
      end
    end
    describe 'validates :email format' do
      context 'メールアドレスが有効であるかどうか' do
        it '@がないのでメールアドレスは無効である' do
          user = User.new(
            name: 'test_user1',
            email: '12345678gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
        it 'ひらがなが使用されているのでメールアドレスは無効である' do
          user = User.new(
            name: 'test_user1',
            email: 'あああああああ@gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
        it 'ひらがなが使用されているのでメールアドレスは無効である' do
          user = User.new(
            name: 'test_user1',
            email: 'あああああああ@gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
        it '@の位置が先頭なのでメールアドレスは無効である' do
          user = User.new(
            name: 'test_user1',
            email: '@12345678@gmail.com',
            password: 12345678,
            )
          expect(user).not_to be_valid
        end
      end
    end
    describe ':password, length: { minimum: 8 }' do
      it 'パスワードが4文字なので無効である' do
        user = User.new(
            name: 'test_user1',
            email: '12345678@gmail.com',
            password: 1234,
            )
          expect(user).not_to be_valid
      end
    end
  end
end

RspecってどこまでDRYに書けばいいのかわからないっすね。。。



参考にさせていただいた記事
Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub

Herokuで本番環境のファイルの保存先をS3に設定する手順

こんにちは!kossyです!





良さげなテック系記事を見つけました。
techracho.bpsinc.jp

結構中〜上級者向けな内容だと思います。何を言っているかわからない部分が5割くらい占めてますので笑
私の勉強不足もあるかと思いますが、、、

週間単位で最新情報を配信してくれているので、
Railsユーザーは毎週チェックした方が良さそうです。





さて、今回はHerokuで本番環境のファイルの保存先をS3に設定する手順を
ブログに残してみたいと思います。




環境
Rails 5.2.0
Ruby 2.5.1
PostgreSQL
gem 'fog' 2.0.0
gem 'carrierwave'
MacOS Mojave



尚、AWSアカウントは既に作成済みとし、
S3がどんなツールなのかは理解しているものとします。

アカウント作成はこちらのページが詳しいかと。
aws.amazon.com






.envファイルの作成

dotenv-railsと言うgemを導入します。

gem 'dotenv-rails'


$ bundle install


AWSのアクセスキー等を記載する.envファイルを作成します。
このファイルはGithub等にプッシュしてしまうと、アクセスキー流出につながり、
不正利用の温床となりかねませんので、
.gitignoreファイルに.envを必ず追加しましょう。

/.bundle

/log/*
/tmp/*

!/log/.keep
!/tmp/.keep

/storage/*

/node_modules
/yarn-error.log

/public/assets

.byebug_history

/config/master.key

.env <= 追加




本番環境用のバケットを作成

新規のバケット作成画面へ移動し、
東京リージョンを選択します。
f:id:kossy-web-engineer:20181109152416p:plain

バケット名は自由ですが、
アプリ名-productionとしておきましょう。

次にバケット内にimagesというフォルダを作成し、
images内で右クリックをし、公開するを選択します。

次に、認証情報のキーを取得します。

メニューバーの自分のアカウント名を選択し、「セキュリティ認証情報」を選択します。
ポップアップが出てきた場合は、「セキュリティ認証情報へ進む」を選択します。
アクセスキーを選択し、「新しいアクセスキーの作成」を選択します。
「キーファイルのダウンロード」を選択します。
ダウンロードしたキーを.envファイルに記載します。

.env

AWS_ACCESS_KEY_ID=自分のID
AWS_SECRET_ACCESS_KEY=自分のSECRET_KEY

こちらのキーは仮に流出した場合、不正利用され高額請求されることもありますので、
取り扱いには十分お気をつけください。

不正利用の事例
初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 - Qiita
AWSが不正利用され300万円の請求が届いてから免除までの一部始終 - Qiita




carrierwaveの設定

app/uploaders/image_uploader.rb

storage :fog
config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: ENV['ACCESS_KEY_ID'],
    aws_secret_access_key: ENV['SECRET_ACCESS_KEY'],
    region: 'us-east-1' # リージョンの位置によって記述が異なります
  }

    case Rails.env
    when 'production'
        config.fog_directory  = 'バケット名'
        config.asset_host = 'https://s3.amazonaws.com/バケット名'
    end
end

Heroku内での設定

$ heroku config:set AWS_ACCESS_KEY_ID=[自分のID]
$ heroku config:set AWS_SECRET_ACCESS_KEY=[自分のシークレットキー]

ターミナルで上記のコマンドを実行すればOKです。



このブログを見てS3の設定をして高額請求をされても、
筆者は責任を負い兼ねますのであしからず。