Ruby on Rails

【Rails】レコードが保存済みか確認するpersisted?メソッド

今回は、ActiveRecordオブジェクトが保存済みかどうか確認するメソッド persisted? を紹介します。

結論

インスタンスが保存済みかどうかをチェックするメソッド

# インスタンスを新規作成・未保存
pry(main)> pokemon = Pokemon.new(name: 'ミミッキュ')
pry(main)> pokemon.persisted?
=> false
pry(main)> pokemon.new_record?
=> true

# インスタンスをDBに保存
pry(main)> pokemon.save!
pry(main)> pokemon.persisted?
=> true
pry(main)> pokemon.new_record?
=> false

# インスタンスをDBから削除
pry(main)> pokemon.destroy!
pry(main)> pokemon.persisted?
=> false
pry(main)> pokemon.new_record?
=> false

目次

  1. 結論
  2. 環境
  3. persisted?メソッドとは
    1. 例) 保存済みであれば、ボタンを表示する
  4. 似たようなメソッド
    1. new_record?
  5. まとめ

環境

OS: MacOS
メモリ: 32GB

Dependents
Rails6
Ruby 2.6
CentOS7 on Vagrant
Mysql 5.7

persisted?メソッドとは

レコードが保存されているかどうかでUIの表示を切り替えたり、
保存されている場合だけ処理を行いたい場合があります。

そんな時は、persisted?を使用すると便利です。
公式ドキュメントはこちらです。
persisted? | Railsドキュメント

簡単に使い方を紹介します!

保存済みであれば、ボタンを表示する

persisted? をviewで使用するケースを考えてみます。
例えば、新規作成画面と編集画面が多くのアプリには存在すると思います。

下のコードは、アイテムが存在する時だけ、削除ボタンを表示させるviewのサンプルコードです。

# form.html.erb

<%= form_with(model: pokemon, local: true, url: path) do |form| %>
  <div>
    <%= form.label :name %>
    <%= form.text_field :name, placeholder: 'ミミッキュ' %>
  </div>
  <div>
    <%= form.label :level %>
    <%= form.text_field :level, placeholder: '50' %>
  </div>

  <div>
    <%= form.submit '登録' %>

    # レコードが存在する場合は、削除ボタンを表示する
    <% if pokemon.persisted? %>
      <%= link_to '削除', pokemon_path(pokemon), method: :delete, data: {confirm: '削除しますか?'} %>
    <% end %>

  </div>
<% end %>

編集するときに「登録」というボタン名もちょっと変なので
更新、という名前に変えたりする場合は以下のように、切り分けることもできます。

<div>
  <% if pokemon.persisted? %>
    <%= form.submit '更新' %>
    <%= link_to '削除', pokemon_path(pokemon), method: :delete, data: {confirm: '削除しますか?'} %>
  <% else %>
    <%= form.submit '登録' %>
  <% end %>
</div>

似たようなメソッド

persisted?と似たメソッドで、new_record?というメソッドがあります。
こちらは、新しいレコードだった場合にtrueを返すメソッドです。
new_record? | Railsドキュメント

new_record?

さっきの例を、new_record?を使って書いてみると、こうなります。
new_recordがtrueということは、新規作成時なので、登録ボタンを表示させています。

<div>
  # 新しいレコードだったら、登録ボタンを表示する
  <% if pokemon.new_record? %>
    <%= form.submit '登録' %>
  <% else %>
    <%= form.submit '更新' %>
    <%= link_to '削除', pokemon_path(pokemon), method: :delete, data: {confirm: '削除しますか?'} %>
  <% end %>
</div>

persisted?とnew_record?の挙動の違いを、タイミングごとにまとめました。

# インスタンスを新規作成・未保存
pry(main)> pokemon = Pokemon.new(name: 'ミミッキュ')
pry(main)> pokemon.persisted?
=> false
pry(main)> pokemon.new_record?
=> true

# インスタンスをDBに保存
pry(main)> pokemon.save!
pry(main)> pokemon.persisted?
=> true
pry(main)> pokemon.new_record?
=> false

# インスタンスをDBから削除
pry(main)> pokemon.destroy!
pry(main)> pokemon.persisted?
=> false
pry(main)> pokemon.new_record?
=> false

まとめ

今回は、persisted?とnew_record?というメソッドについて紹介しました。
persisted?は、レコードが保存されていたらtrue、
new_record?は、レコードが保存されていなかったらtrue、をそれぞれ返します。

インスタンスが削除されていた場合は、どちらもfalseを返すという点もポイントです。

ピックアップ記事

  1. 【WPテーマ自作】ローカル環境でWP開発ができる「Local」の導入
  2. 【Rails】modelを作成する
  3. 【WPテーマ自作】UnderScoresの導入
  4. 【Blender】起動時に強制終了してしまう問題
  5. 起動時の設定をカスタムする【Blender】

関連記事

 
  1. Ruby on Rails

    【Rails】ActiveStorageで添付ファイルを削除したいときは、purgeを使う

    動作確認するために、active_storageでアップロードした画…

  2. Ruby on Rails

    【Rails】modelを作成する

    結論rails generateコマンドを使いましょ…

  3. Ruby on Rails

    【Rails】Factory already registered: エラー

    railsでアプリ開発中、最新のfeatureブランチでリベースして…

  4. Ruby on Rails

    【Rails】railsでIndex name ‘xxx’ on table…

    railsで、dbを変更するためにmigrationを実行した際、in…

  5. Ruby on Rails

    【Rails】migrationでカラムを追加・削除したい

    migrationファイルでよく使う記述。テーブルにカラムを追加・削…

  6. Ruby on Rails

    【Rails】文字列からHTMLタグを取り除く方法

    Railsで、HTMLタグを取り除いて文字列を出力したい時があります。…

カレンダー

2024年11月
 123
45678910
11121314151617
18192021222324
252627282930  

最近の記事

  1. Blender

    【UE4】用語備忘録メモ
  2. Ruby on Rails

    【Rails】selectメソッドで特定の条件を満たす要素を取得する
  3. Blenderの複数バージョンを簡単に管理できるBlenderLauncherの使い方

    Blender

    【Blender】複数バージョンを簡単に管理できる、BlenderLaunche…
  4. Blender

    【Blender】レンダリング結果を新規ウィンドウで開かないようにする
  5. Blender

    【Blender】MMDファイルをBlenderにImportするアドオン
PAGE TOP