第6章
データベースを変更しないようにコンソールを使う
コンソール
rails console --sandbox
オブジェクトが有効化を確認
コンソール
>> user.valid?
true
データベースにオブジェクトを保存
コンソール
>> user.save
オブジェクトの生成とデータベースへの保存
コンソール
>> User.create(name: "A Nother", email: "another@example.org")
データベースからの削除
コンソール
>> foo.destroy
idからデータを検索
コンソール
>> User.find(1)
値からデータを検索
コンソール
>> User.find_by(email: "michael@example.com")
データベースの最初のデータを検索
コンソール
>> User.first
データベースの全てのデータを検索
コンソール
>> User.all
オブジェクトの再読み込み
コンソール
>> user.email
=> "mhartl@example.net"
>> user.email = "foo@bar.com"
=> "foo@bar.com"
>> user.reload.email
=> "mhartl@example.net"
オブジェクトの更新
コンソール
>> user.update(name: "The Dude", email: "dude@abides.org")
特定の属性のみ更新
コンソール
>> user.update_attribute(:name, "El Duderino")
エラーメッセージの確認
コンソール
>> user.errors.full_messages
=> ["Name can't be blank"]
テストが失敗したときにエラーメッセージを出力
test/models/user_test.rb
assert @user.valid?, "#{valid_address.inspect} should be valid"
メールフォーマットを正規表現で検証
app/models/user.rb
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX }
データを複製する
test/models/user_test.rb
duplicate_user = @user.dup
データが重複していないことを検証
app/models/user.rb
uniqueness: true
大文字小文字の区別する
app/models/user.rb
case_sensitive: true
一意性を強制するマイグレーション
db/migrate/[timestamp]_add_index_to_users_email.rb
add_index :users, :email, unique: true
データベースの保存前に行う処理
app/models/user.rb
before_save { self.email = email.downcase }
ハッシュ化されたパスワードの実装
app/models/user.rb
has_secure_password
第7章
デバック情報をブラウザに表示
app/views/layouts/application.html.erb
<%= debug(params) if Rails.env.development? %>
デバック情報をターミナルに表示
app/controllers/users_controller.rb
debugger
デバック情報をターミナルに表示
app/controllers/users_controller.rb
<%= gravatar_for @user %>
オブジェクトに対するフォームを作成する
app/views/users/new.html.erb
<%= form_with(model: @user) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
HTTPステータスコード422をレスポンスとして設定
app/views/users/new.html.erb
status: :unprocessable_entity
キーに紐づけられたパラメータの中で選択されたものだけ変更可能
app/controllers/users_controller.rb
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
受け取った整数(第1引数)に基づき英単語(第2引数)を複数形にする
app/controllers/users_controller.rb
>> helper.pluralize(1, "error")
=> "1 error"
>> helper.pluralize(5, "error")
=> "5 errors"
ブロックないの処理を実行する前後で値(第1引数)が変わらないことを確認
test/integration/users_signup_test.rb
assert_no_difference 'User.count' do
ブロックないの処理を実行する前後で変わる値(第1引数)の差異(第2引数)を確認
test/integration/users_signup_test.rb
assert_no_difference 'User.count' do
POSTリクエストの送信結果から指定されたリダイレクト先に移動する
test/integration/users_signup_test.rb
follow_redirect!
第8章
POSTリクエストの送信結果から指定されたリダイレクト先に移動する
test/integration/users_signup_test.rb
follow_redirect!
フラッシュメッセージ表示後、リクエストが発生したときに消滅する
app/controllers/sessions_controller.rb
flash.now[:danger] = 'Invalid email/password combination'
セッションをリセットする
app/controllers/sessions_controller.rb
reset_session
右辺に値があれば左辺に格納、なければ何もしない
app/helpers/sessions_helper.rb
@current_user ||= User.find_by(id: session[:user_id])
HTTPのリクエスト(第3引数)を指定
app/views/layouts/_header.html.erb
<%= link_to "Log out", logout_path,
data: { "turbo-method": :delete } %>
第9章
cookiesにデータを保存
app/helpers/sessions_helper.rb
cookies.permanent.encrypted[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
cookiesのデータを破棄
app/helpers/sessions_helper.rb
cookies.delete(:user_id)
cookies.delete(:remember_token)
第10章
新しいデータか確認
コンソール
>> User.new.new_record?
=> true
該当メソッドが実行される直前で実行されるメソッド
コンソール
before_action :logged_in_user, only: [:edit, :update]
ページネーション
app/views/users/index.html.erb
<%= will_paginate %>