【Ruby】三項演算子

内容

Ruby三項演算子A ? B : Cについて

経緯

三項演算子
Devise::RegisterController#after_update_path_for
に現れて調べたため備忘録

三項演算子とは

A ? B : C

if 条件式A
  B #(条件式Aがtrueの時の処理)
else
  C #(条件式Bがfalseの時の処理)
end

と同義です。

三項演算子を用いる際の注意点

注意点① : コロン:前後のスペース のつけ忘れの注意

Rubyの言語仕様のためコロン:前後のスペース を忘れるとSyntax Errorになります

注意点② : 三項演算子のあとでさらにif文を追加するとカオスになる

ネストしないif else endの簡略化にはいいですが、
複数if文がある場合は見づらくなるかも

参考

【Ruby】 三項演算子をマスターしてコードを簡潔に書けるようにしよう。 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
Rubyの三項演算子の話 - Qiita
条件演算子 - 演算子式 (Ruby 3.0.0 リファレンスマニュアル)

【Rails】devise - アカウント作成・更新後のリダイレクト遷移先をカスタマイズする

内容

Ruby on Railsgem 'devise'
アカウント作成・更新した後のリダイレクト遷移先のパスの変更の方法

前提

① deviseの登録・認証を使用するモデル設定

$ rails g devise User

② deviseのコントローラのルーティング

Rails.application.routes.draw do
  devise_for :users,
    controllers: { 
      registrations: 'registrations',
    }

デフォルト設定

devise本家では
アカウント作成した後のデフォルトのリダイレクト遷移先は
次のように定義されています

いつ デフォルトの遷移先パス 遷移先パスを定義しているメソッド
アカウント作成後
(Devise::RegistrationsController#create)
after_sign_in_path_for(resource)と同じパス after_sign_up_path_for(resource)
アカウント更新後
(Devise::RegistrationsController#update)
signed_in_root_path(resource)
new_session_path(resource)
(条件分岐)
after_update_path_for(resource)

カスタマイズ

デフォルトの遷移先パスから変更したい場合は、
ソースコードで定義されている
after_sign_in_path_for メソッド
after_update_path_forメソッド
をオーバーライドします

カスタマイズの例
class RegistrationsController < Devise::RegistrationsController

  protected
  
  def after_update_path_for(resource)
    user_path(resource)
  end

  def after_sign_up_path_for(resource)
    users_path
  end

end

【Rails】devise - ログイン・ログアウト後のリダイレクト先をカスタマイズする

内容

Ruby on Railsgem 'devise'
ログイン・ログアウトした後のリダイレクト遷移先のパスの変更の方法

デフォルト設定

devise本家では
デフォルトのログイン・ログインした後のリダイレクト遷移先は
次のように定義されています

いつ デフォルトの遷移先パス 遷移先パスを定義しているメソッド
ログイン後
(Devise::SessionsController)
root_path after_sign_in_path_for(resource)
ログアウト後
(Devise::SessionsController#respond_to_on_destroy)
root_path after_sign_out_path_for(resource)

カスタマイズ

デフォルトの遷移先パスから変更したい場合は、
ソースコードで定義されている
after_sign_path_for メソッド
after_sign_out_path_forメソッド
をオーバーライドします

カスタマイズの例
class SessionsController < Devise::SessionsController

  protected

  def after_sign_in_path_for(resource)
    users_path
  end

  def after_sign_out_path_for(resource)
    flash[:notice] = "ログアウトしました"  # flashメッセージの追加もできます
    root_path
  end
end

【Rails】devise - モジュールの追加方法

経緯

・アカウント作成機能・ログイン機能の実装のまとめ・整理・備忘録

内容

Ruby on Railsgem 'devise'
モジュール追加の方法

deviseのモジュール

deviseで使用できるモジュール

deviseのモジュールの使用方法

前準備

deviseの前準備が完了済みとします

migrationファイルで使用するモジュールのコメントアウトを解除
$ rails g devise User

を実行したときに作成されるmigrationファイルdb/migrate/yyyymmddhhmmdd_devise_create_users.rb
使用するモジュールのコメントアウトを解除
: confirmableモジュールを使いたいのでコメントアウト解除

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users, id: false do |t|
      t.string :id, limit: 36, null: false, primary_key: true
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.inet     :current_sign_in_ip
      # t.inet     :last_sign_in_ip

      # Confirmable
      # コメントアウト解除
 +     t.string   :confirmation_token
 +     t.datetime :confirmed_at
 +     t.datetime :confirmation_sent_at
 +     t.string   :unconfirmed_email # Only if using reconfirmable

rails db:migrate

$ rails db:migrate

deviseのモデルにモジュールを追記

migrationファイルでコメントアウトして
使用するとしたモジュールを
deviseのモデルに追記します

例としてconfirmableのモジュールを追加する場合

class User < ApplicationRecord
 -  devise :database_authenticatable, :registerable,
 -        :recoverable, :rememberable, :validatable, :confirmable

 + devise :database_authenticatable, :registerable,
 +         :recoverable, :rememberable, :validatable, :confirmable

end

【Rails】devise - deviseの基本実装手順

経緯

アカウント作成・ログイン機能の実装のまとめ・整理・備忘録
deviseの基本実装手順をまとめる  

内容

deviseの基本実装手順
devise/README.mdに記載されている内容

前準備①:deviseをインストール

gem 'devise'
$ bundle install

前準備② : deviseのセットアップファイルの作成

$ rails g devise:install

・config/initializers/devise.rb
・config/locales/devise.en.yml
が作成されます

前準備③ : deviseの認証を使うモデルを作成する

$ rails g devise User
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end

前準備④ : deviseコントローラーのルーティング

Rails.application.routes.draw do
  devise_for :users,
    controllers: { 
      registrations: 'registrations',
      sessions: :sessions,
      passwords: 'passwords'
    }

【はてなブログ】コードシンタックスでファイル名のタイトルを付けたい

経緯

はてなブログの記事作成時、
コードのシンタックスにファイル名を付け加えたいと思い

内容

はてなブログの記事作成時の
コードのシンタックスにファイル名表示のスタイルを追加する方法

参考

こちらを参考にしました

はてなブログでソースコード表示時にタイトルを付ける - 酔いどれ技術者の備忘録

【Rails】devise - user_signed_in?

経緯

アカウント作成機能・ログイン機能の実装のまとめ・整理・備忘録

内容

Ruby on Railsgem 'devise'
ヘルパーメソッドuser_signed_in?について

ソースコード

/lib/devise/controllers/helpers.rb で動的メソッドとして定義されています。

  def #{mapping}_signed_in?  
    !!current_#{mapping}  
  end  

!!なしの下記と同じ意味ですが、true/falseを明示する意図でしょうか...?

  def #{mapping}_signed_in?  
    current_#{mapping}  
  end  

sign-in(ログイン)した後は
認証された後のモデルレコードが
current_#{hogehoge}として格納されているので
#{hogehoge}_signed_in はtrueとなります

参考

devise/helpers.rb