Closed mako4kamiya closed 4 years ago
docker-compose down
しちゃったから、bundle install
もう一回やらないといけなかた。
docker-compose stop
で止める。docker-compose restart
で再起動。
bin/rails g model StaffMember
class CreateStaffMembers < ActiveRecord::Migration[6.0]
def change
create_table :staff_members do |t|
t.timestamps
end
end
end
ブロック変数t
はTableDefinitionオブジェクト。
このオブジェクトの書くメソッドを呼び出すことでテーブルの定義を行う。
Active Record マイグレーション
t.timestamps
はcreated_at
とupdated_at
カラムを生成するメソッド。
一般的には
t.column :email, :string
だけど、省略して下記のように書く。
t.string :email
class CreateStaffMembers < ActiveRecord::Migration[6.0]
def change
create_table :staff_members do |t| #tはTableDefinitionオブジェクト
t.string :email, null: false # メールアドレス
t.string :family_name, null: false # 姓
t.string :given_name, null: false # 名
t.string :family_name_kana, null: false # 姓(カナ)
t.string :given_name_kana, null: false # 名(カナ)
t.string :hashed_password # パスワード
t.date :start_date, null: false # 開始日
t.date :end_date # 終了日
t.boolean :suspended, null: false, default: false # 無効フラグ
t.timestamps
end
add_index :staff_members, "LOWER(email)", unique: true #PostgreSQLは大文字と小文字を区別してしまう。
add_index :staff_members, [ :family_name_kana, :given_name_kana ] #複合インデックス
end
end
インデックスをつけることで、検索が高速化する。 複合インデックスとは?
余談。
bin/rails db:setup
コマンドは、
bin/rails db:create
,bin/rails db:schema:load
,bin/rails db:seed
を一気に実行する。
開発したアプリケーションを誰かに渡したときに、その人がデータベースを初期化して立ち上げるときには、bin/rails db:setup
をつかう。
createもしてくれるし、migrateして作られたschemaもロードするし。
Active Record はRubyの世界とデータベースの世界を結びつける。
作ったテーブルにどんなカラムがを持っているかを調べる。 `$ bin/rails r "StaffMember.columns.each { |c| p [ c.name, c.type ] }"
rails c
consoleコマンドを使うと、コマンドラインでRailsアプリケーションとやり取りすることができます。rails consoleは内部的にIRBを使っているので、IRBを使ったことがあれば簡単に扱えます。IRBは、思いついたアイデアを試してみたり、ウェブサイトにアクセスすることなくサーバのデータを変更したりするのに役立ちます。
**rails r***
runnerコマンドを使うと、非対話的にRailsの文脈でRubyのコードを実行することができます。たとえば次のようになります。
$ rails runner "Model.long_running_method"
使い分けがよくわからない。
idの主キー(primary key)は、自動的にセットされる。
何らかの理由でidの表記を変えたいときは、create_table
メソッドのprimary_key
オプションで変えられる。
create_table :staff_members, primary_key: "member_id" do |t|
Railsはモデル名に対してそれにsをつけたテーブル名を作成する。 例)StaffMemberモデル、staff_membersテーブル
以下をモデルの上に書くと変えられる。
self.table_name = "M_SHOKUIN"
Railsを用いずに開発されたシステムをRailsで移植する場合に使う。
Gem bcryptを使って、パスワードをハッシュ化し、平文で保存しない。
以下をapp/models/staff_member.rbに追加
class StaffMember < ApplicationRecord
def password=(raw_password)
if raw_password.kind_of?(String)
self.hashed_password = BCrypt::Password.create(raw_password)
elsif raw_password.nil?
self.hashed_password = nil
end
end
end
password=
メソッドに文字列の引数が渡されたとき、その引数をraw_password
に入れて、BCrypt::Password.create
メソッドを実行してハッシュ化する。ハッシュ化した値をStaffMembersモデルのhashed_password属性にセットする。
引数が空ならnil
を入れる。
spec/models/staff_member_spec.rbに追加
RSpec.describe StaffMember, type: :model do
describe "#password=" do
example "文字列を与えると、hashed_passwordは長さ60の文字列になる" do
member = StaffMember.new
member.password = "baukis"
expect(member.hashed_password).to be_kind_of(String)
expect(member.hashed_password.size).to eq(60)
end
end
end
おさらいRspecの書き方 expect(ターゲット).to マッチャー
be_kind_ofは、member.hashed_password
があるクラスのインスタンスであるかどうかを調べている。
BCrypt::Password.create
メソッドの戻り値は、BCrypt::Password
クラスのインスタンスだが、BCrypt::Password
はStringスラスを継承しているため、be_kind_of(String)で調べてる。
もう1つ追加。
example "nilを与えると、hashed_passwordはnilになる" do
member = StaffMember.new(hashed_password: "x")
member.password = nil
expect(member.hashed_password).to be_nil
end
hashed_password属性にnilではない何か(x)がセットされているオブジェクトに対して、引数にnilを入れたpassword=メソッドを呼び出すと、 hashed_passwordがnilになるのを確かめる。
db/seeds.rb
table_names = %w(staff_members administrators staff_events customers)
table_names.each do |table_name|
path = Rails.root.join("db", "seeds", Rails.env, "#{table_name}.rb")
if File.exist?(path)
puts "Creating #{table_name}...."
require(path)
end
end
db/seeds/development/staff_members.rb
StaffMember.create!(
email: "taro@example.com",
family_name: "山田",
given_name: "太郎",
family_name_kana: "ヤマダ",
given_name_kana: "タロウ",
password: "password",
start_date: Date.today
)
bin/rails db:seed
で実行すると、「Creating staff_members....」と表示される。
get "login" => "sessions#new", as: :login
as
は、ルーティングに名前をつける。erbでシンボルでURLパス参照できる。
ユーザー認証を実装するための、データベース、モデルを作成する。sessionについても学ぶ。