プロダクト開発日誌

技術のことなど

Rails app に Rubocopを導入する

github.com

Gemfile

group :development do
  # A Ruby static code analyzer and formatter, based on the community Ruby style guide. https://docs.rubocop.org
  gem 'rubocop', require: false
end
bundle install

touch .rubocop.yml

AllCops:
  Rails: true

  Exclude:
  - bin/**/*
  - config/environments/**/*
  - config/initializers/**/*
  - config/application.rb
  - config/puma.rb
  - config/spring.rb
  - db/schema.rb
  - db/migrate/**/*
  - db/seeds.rb
  - lib/tasks/**/*
  - public/**/*
  - node_modules/**/*
  - vendor/**/*


# "Missing top-level class documentation comment."を無効
Style/Documentation:
  Enabled: false

LineLength:
  Max: 120

使い方

bundle exec rubocop

自動修正

bundle exec rubocop --auto-correct

annotateでschemeをmodelに書き出す

github.com

Gemfile

group :development do
  gem 'annotate'
end
bundle install

使い方

bundle exec annotate

テーブルの情報がコメントで記載されます

# == Schema Information
#
# Table name: areas
#
#  id            :bigint(8)        not null, primary key
#  name          :string           not null
#  description   :string
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#  prefecture_id :integer
#

class Area < ApplicationRecord
  # -------------------------------------------------------------------------------
  # Relations
  # -------------------------------------------------------------------------------
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture
  # -------------------------------------------------------------------------------
  # Validations
  # -------------------------------------------------------------------------------
  validates :name, presence: true
end

【Rails】モデルに都道府県情報を持たせる

今回はacrive__hashを利用して、Area Model に都道府県情報を付与します。

github.com

install

# A readonly ActiveRecord-esque base class that lets you use a hash, a Yaml file or a custom file as the datasource. Read more: https://github.com/zilkey/active_hash
gem 'active_hash'
bundle install

touch app/models/prefecture.rb

class Prefecture < ActiveHash::Base
  fields :name, :name_en
  create id: 0, name: '未設定', name_en: 'not set'
  create id: 1, name: '北海道', name_en: 'hokkaido'
  create id: 2, name: '青森県', name_en: 'aomori'
  create id: 3, name: '岩手県', name_en: 'iwate'
  create id: 4, name: '宮城県', name_en: 'miyagi'
  create id: 5, name: '秋田県', name_en: 'akita'
  create id: 6, name: '山形県', name_en: 'yamagata'
  create id: 7, name: '福島県', name_en: 'fukushima'
  create id: 8, name: '茨城県', name_en: 'ibaraki'
  create id: 9, name: '栃木県', name_en: 'tochigi'
  create id: 10, name: '群馬県', name_en: 'gumma'
  create id: 11, name: '埼玉県', name_en: 'saitama'
  create id: 12, name: '千葉県', name_en: 'chiba'
  create id: 13, name: '東京都', name_en: 'tokyo'
  create id: 14, name: '神奈川県', name_en: 'kanagawa'
  create id: 15, name: '新潟県', name_en: 'niigata'
  create id: 16, name: '富山県', name_en: 'toyama'
  create id: 17, name: '石川県', name_en: 'ishikawa'
  create id: 18, name: '福井県', name_en: 'fukui'
  create id: 19, name: '山梨県', name_en: 'yamanashi'
  create id: 20, name: '長野県', name_en: 'nagano'
  create id: 21, name: '岐阜県', name_en: 'gifu'
  create id: 22, name: '静岡県', name_en: 'shizuoka'
  create id: 23, name: '愛知県', name_en: 'aichi'
  create id: 24, name: '三重県', name_en: 'mie'
  create id: 25, name: '滋賀県', name_en: 'shiga'
  create id: 26, name: '京都府', name_en: 'kyoto'
  create id: 27, name: '大阪府', name_en: 'osaka'
  create id: 28, name: '兵庫県', name_en: 'hyogo'
  create id: 29, name: '奈良県', name_en: 'nara'
  create id: 30, name: '和歌山県', name_en: 'wakayama'
  create id: 31, name: '鳥取県', name_en: 'tottori'
  create id: 32, name: '島根県', name_en: 'shimane'
  create id: 33, name: '岡山県', name_en: 'okayama'
  create id: 34, name: '広島県', name_en: 'hiroshima'
  create id: 35, name: '山口県', name_en: 'yamaguchi'
  create id: 36, name: '徳島県', name_en: 'tokushima'
  create id: 37, name: '香川県', name_en: 'kagawa'
  create id: 38, name: '愛媛県', name_en: 'ehime'
  create id: 39, name: '高知県', name_en: 'kochi'
  create id: 40, name: '福岡県', name_en: 'fukuoka'
  create id: 41, name: '佐賀県', name_en: 'saga'
  create id: 42, name: '長崎県', name_en: 'nagasaki'
  create id: 43, name: '熊本県', name_en: 'kumamoto'
  create id: 44, name: '大分県', name_en: 'oita'
  create id: 45, name: '宮崎県', name_en: 'miyazaki'
  create id: 46, name: '鹿児島県', name_en: 'kagoshima'
  create id: 47, name: '沖縄県', name_en: 'okinawa'
end

都道府県データ参考: http://www.kokudo.or.jp/master/001.html

エリアに都道府県を持たせる

エリアにカラムを追加

bundle exec rails generate migration AddPrefectureIdToAreas prefecture_id:string
bundle exec rails db:migrate

ストロングパラメーターに追加

app/controllers/areas_controller.rb

# Never trust parameters from the scary internet, only allow the white list through.
def area_params
  params.require(:area).permit(:name, :description, :prefecture_id)
end

エリアは都道府県に属する

app/models/area.rb

class Area < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture
end

View

app/views/areas/_form.html.slim

.field
  = f.label :prefecture_id
  = f.collection_select :prefecture_id, Prefecture.all, :id, :name

app/views/areas/show.html.slim

p
  strong Prefecture:
  = @area.prefecture.name

デバック用のgemをrails アプリに追加する

Better Errors

標準のRailsエラーページを遥かに優れたエラーページに置き換えます。 github.com

Binding of caller

Better Errors のエラー画面でirbを利用できるようになる。 github.com

Pry byebug

段階的なデバッグ機能とスタックナビゲーション機能を追加します。 github.com

Pry rails

Pryはirbの代替となるパワフルな対話ツール。ドキュメントが見れる。シンタックスハイライト。 github.com

hirb

irbのレコードの出力を整形する github.com

hirb unicode

hirbのUnicode Support github.com

pry-doc

pryのドキュメントをサポート github.com

view_source_map

パーシャルのパス情報をHTMLコメントとして出力 github.com

設定

Gemfile

group :development do
  # Better error page for Rack apps. Read more: https://github.com/BetterErrors/better_errors
  gem 'better_errors' 
  # Retrieve the binding of a method's caller in MRI 1.9.2+. Read more: https://github.com/banister/binding_of_caller
  gem 'binding_of_caller'
  # Step-by-step debugging and stack navigation in Pry. Read more: https://github.com/deivid-rodriguez/pry-byebug
  gem 'pry-byebug'
  # Rails >= 3 pry initializer. Read more: https://github.com/rweng/pry-rails
  gem 'pry-rails'
  # A mini view framework for console/irb that's easy to use, even while under its influence. Read more: https://github.com/cldwalker/hirb
  gem 'hirb'
  # Unicode support for hirb. Read more: https://github.com/miaout17/hirb-unicode
  gem 'hirb-unicode'
  # Provide MRI Core documentation and source code for the Pry REPL. Read more:  https://github.com/pry/pry-doc
  gem 'pry-doc'
  # Rails plugin to view source map. Read more: https://github.com/r7kamura/view_source_map
  gem "view_source_map"
end

Gem をInstall

bundle install

rails scaffold コマンドでモデルを作成する

今回はエリアモデルを作成します。

bin/rails generate scaffold Area name:string description:string

https://railsguides.jp/command_line.html#rails-generate

nameは必須にします。

class CreateAreas < ActiveRecord::Migration[6.0]
  def change
    create_table :areas do |t|
      t.string :name, null: false
      t.string :description

      t.timestamps
    end
  end
end

https://railsguides.jp/active_record_migrations.html#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%99%E3%82%8B

モデルでもバリデーションを記述します app/models/area.rb

class Area < ApplicationRecord
  # --------------------------------------------------
  # Validations
  # --------------------------------------------------
  validates :name, presence: true
end

https://railsguides.jp/active_record_validations.html

Migration

bin/rails db:migrate

http://localhost:3000/areas