【Rails】 renderとredirect_toの違い
メンターさんに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 【とても面倒】
フォントサイズの指定はこのようにすると、計算が楽でとても便利!
【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
参考サイト
【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"
【Rails】ターミナルでルーティングの確認をする方法
ルーティングを確認したい時、ターミナルに打つコマンド
$ rails routes