プロダクト開発日誌

技術のことなど

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

最新のRuby on Rails でアプリを作成

rails のInstall

bundle init

rails のgemを追加

# Gemfile
+ gem 'rails', github: 'rails/rails'

github.com

rails をInstall

bundle install --path vendor/bundle --jobs=4

rails のバージョンを確認

bundle exec rails -v
Rails 6.0.0.beta3

新アプリの作成

bundle exec rails new . -d postgresql --skip-turbolinks --skip-test

DBの作成

bundle exec rails db:create

開発用サーバの起動

bundle exec rails s

ブラウザからアクセス

http://localhost:3000/

f:id:synapse51:20190401174626p:plain 終わり

ざっくりHaml

Haml (HTML Abstraction Markup Lunguage)

概要

コツ

  • h1, tableなどは開始タグと閉じタグを削除し、%をタグにつける。
  • id属性、class属性、その他の属性を追加する場合は、{}でハッシュ形式
  • ifやeachなどロジック部分の行には、先頭に-
  • インデントに気をつける

準備

作業用ディレクトリの作成

$ mkdir haml_lesson; and cd haml_lesson
$ code .

Rubyのバージョンを指定

$ rbenv local 2.5.1
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

hamlのインストール

$ sudo gem update --system
$ gem install haml
$ gem list | grep haml
haml (5.0.4)

変換

大まかな流れとして、hamlファイルをhamlに通すとhtmlが出来上がる。

$ string trim '
!!!
%haml
  %body
    hello world!
'> index.haml

htmlに変換

$ haml -q index.haml index.html
# -q : シングルクォーテーションではなくダブルクオテーションを使用する

確認

$ less index.html

基本

  • !!! → <!DOCTYPE html>
  • % → 開始タグと終了タグ

属性

htmlっぽく書いたり,htmlっぽく書いたりできる

%p(class="test") hello world or %p{class: "test"} hello world
↓
<p class='test'>hello world</p>

他にもさまざまな書き方ができる

%div{id: "main", class: "test"}
%div(id="main" class="test")
%div#main.test
#main.test
↓
<div class='test' id='main'></div>

コメント

/ end body
↓
<!-- end body -->

/ コメント
  コメント
  コメント
↓
<!--
  コメント
  コメント
  コメント
-->

hamlファイルのみのコメント

-# コメント

改行

%p hello
↓
<p>hello</p>
%p
  hello
↓
<p>
  hello
</p>
%p<
  hello
↓
<p>hello</p>

Filter

:css
  .myStyle {
    color: red;
  }

↓

<style>
  .myStyle {
    color: red;
  }
</style>
:javascript
  alert(1);
  if (1) {
    alert(2);
  }

↓

<script>
  alert(1);
  if (1) {
    alert(2);
  }
</script>
%div
  :escaped
    <html>
    </html>

↓

<div>
&lt;html&gt;
&lt;/html&gt;
</div>

Rubyの評価

%p total is #{3 + 9}
↓
<p>total is 12</p>
%p= Time.now
↓
<p>2018-10-05 10:42:56 +0900</p>
- x = 10
%p= x
↓
<p>10</p>
- (1..10).each do |i|
  %p{id: "item_#{i}"} #{i}
↓
<p id='item_1'>1</p>
<p id='item_2'>2</p>
<p id='item_3'>3</p>
<p id='item_4'>4</p>
<p id='item_5'>5</p>
<p id='item_6'>6</p>
<p id='item_7'>7</p>
<p id='item_8'>8</p>
<p id='item_9'>9</p>
<p id='item_10'>10</p>