【Rails】 renderとredirect_toの違い

[環境]
Rails 5.2.6
ruby 2.6.5

メンターさんにrenderとredirect_toの違いを聞いた。

困ったこと

ログイン失敗後に再度、ページの更新ボタンで読み込みを行うとエラーが発生する。

コード内容はこちら↓

# sessions_controller.rb
def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      redirect_to user_path(user.id)
    else
      flash.now[:danger] = 'ログインに失敗しました'
      render :new
    end
  end

renderを使用するメリット

1から読み込み直すredirect_toと比べ、renderには早く表示ができるメリットがある。 (ただ戻すのか(render:)、一からページを読み込んで表示するのか(redirect_to:)の違いがある。 )

renderを使用するとエラーが出る原因

【renderをした場合は記憶の中にあるviewのページを表示しているだけ】

ログインに成功すればsessions_controller.rbのcreateアクション(ログイン状態を作成するためのアクション)に処理が進んでいるはずだったので、URLが「/sessions」になってしまっている。その為このURL(/sessions)のまま更新ボタンを押してしまうと、表示しているページと現在のURLの ミスマッチが生じて、No Route error またはRouting Errorが発生してしまう。

【CSS】お勧めのフォントサイズ指定方法

CSSでフォントサイズ指定をする際の、お勧めの設定方法。

html  {
  font-size: 62.5%;
}

まず上記のように、 html要素に対して「font-size: 62.5%」を設定、ブラウザの基準フォントサイズが16pxの為、下記の様な計算結果となる。

16 * 62.5 * (1 / 100) = 10

フォントサイズに関しては pxを使用するのはお勧めできない、
・ PC
タブレット
スマホ
など、様々な端末の表示に対応する為、絶対指定のpxでは端末によるフォントサイズの変更ができず扱いづらい。

html要素に上記の設定をした後は、子要素以下はremでフォントサイズを指定。
※ remはhtml要素のフォントサイズを1 とし、相対的にフォントサイズを指定する事ができる。

例えば...
・ html要素のfont-sizeを10pxと指定すると1remは10px、1.5remは15px 【とても楽】
・ html要素のfont-sizeを16pxと指定すると1remは16px、0.9375remが15px 【とても面倒】

フォントサイズの指定はこのようにすると、計算が楽でとても便利!

【Rails】rails db:resetとrails db:seed

[環境]
Rails 5.2.6
ruby 2.6.5

100個のサンプルデータができるようにdb/seeds.rbファイルにコードを記述し、 データベースのリセット後にサンプルデータを作りたかった為、

$ rails db:reset

$ rails db:seed

をしたところ、200個のサンプルデータができてしまった。

$ rails db:reset

をするとrails db:seedも行なってくれるらしい。

【Ruby】unless 修飾子の使い方

[環境]
ruby 2.6.5

unless は if と反対で、条件式が偽の時に then 以下の式を評価します。unless 式にelsif を指定することはできません。 右辺の条件が成立しない時に、左辺の式を評価してその結果を返します。条件が成立すれば nil を返します。

irbで実験をした

aに1を代入、bにnilを代入すると...、aが返ってくる

$ irb
irb(main):001:0> a = 1
=> 1
irb(main):002:0> b = nil
=> nil
irb(main):003:0> a unless b
=> 1

引き続き、b = falseを代入すると...、同じくaが返ってくる

irb(main):004:0> b = false
=> false
irb(main):005:0> a unless b
=> 1

最後に、b = 2を代入すると...、nilが返ってくる

irb(main):006:0> b = 2
=> 2
irb(main):007:0> a unless b
=> nil

参考サイト

docs.ruby-lang.org

【Rails】メールアドレスのユニーク制約時 modelとデータベースでのlogの違い

メールアドレスのユニーク制約時に、modelとデータベースで発生するlogの違いを見たいと思い実験をした。

modelでのユニーク制約時

user.rbに記載↓

validates :email,  uniqueness: true

ターミナル上でrails consoleを利用してデータの登録↓

irb(main):001:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.1ms)  BEGIN
  User Exists (0.6ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test01@example.com"], ["LIMIT", 1]]
  User Create (0.6ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "test01"], ["email", "test01@example.com"], ["password_digest", "password"], ["created_at", "2021-08-08 10:28:17.183847"], ["updated_at", "2021-08-08 10:28:17.183847"]]
   (0.4ms)  COMMIT
=> #<User id: 1, name: "test01", email: "test01@example.com", password_digest: "password", created_at: "2021-08-08 10:28:17", updated_at: "2021-08-08 10:28:17">

もう一度同じメールアドレスで登録を試みると、ROLLBACKが発生↓

irb(main):002:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.2ms)  BEGIN
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test01@example.com"], ["LIMIT", 1]]
   (0.3ms)  ROLLBACK
=> #<User id: nil, name: "test01", email: "test01@example.com", password_digest: "password", created_at: nil, updated_at: nil>

エラーメッセージはこちら↓

=> {:email=>["has already been taken"]}

データベースでのユニーク制約時

db/schema.rbの中身↓

ActiveRecord::Schema.define(version: 2021_08_08_091127) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end

user.rbに記載↓したこちらのコードは、データベースでのユニーク制約時のlogが見たいので削除

validates :email,  uniqueness: true

ターミナル上でrails consoleを利用してデータの登録↓をしたが、ActiveRecord::RecordNotUniqueが発生

irb(main):001:0> User.create(name: "test01", email: "test01@example.com", password_digest: "password")
   (0.1ms)  BEGIN
  User Create (5.0ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "test01"], ["email", "test01@example.com"], ["password_digest", "password"], ["created_at", "2021-08-08 10:36:02.801059"], ["updated_at", "2021-08-08 10:36:02.801059"]]
   (0.2ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):1
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_email")
DETAIL:  Key (email)=(test01@example.com) already exists.
: INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"