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. 【Rails】modelを作成する
  2. 【Blender】アニメーションでポーズを左右反転してコピペしたい時
  3. 【Blender】レンダリング結果を新規ウィンドウで開かないようにする
  4. 【Blender】起動時に強制終了してしまう問題
  5. 【Rails】selectメソッドで特定の条件を満たす要素を取得する

関連記事

 
  1. 【Rails】オブジェクトの中身をログに出力する

    Ruby on Rails

    【Rails】オブジェクトの中身をログに出力する

    オブジェクトの中身をデバッグしたりする時に便利出力結果をみやすい形に…

  2. Ruby on Rails

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

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

  3. railsをproductionモードで実行する

    Ruby on Rails

    【Rails】railsをproductionモードで実行する

    結論--environmentオプションを使用します。…

  4. Ruby on Rails

    【Rails】development? production? 開発環境ごとに処理を切り分けたい時

    Railsで、開発環境ごとに処理を切り替えたい時の方法を紹介します。ま…

  5. Ruby on Rails

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

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

カレンダー

2026年2月
 1
2345678
9101112131415
16171819202122
232425262728  

最近の記事

  1. 慣れれば3分!Bumpノードを使用した質感表現の方法

    Blender

    【Blender】Bumpを使用した質感表現の方法
  2. Blenderの複数バージョンを簡単に管理できるBlenderLauncherの使い方

    Blender

    【Blender】複数バージョンを簡単に管理できる、BlenderLaunche…
  3. gitでファイル変更の一部をコミットする

    git

    git add -p でファイルの一部をコミットする【Git】
  4. Blender

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

    起動時の設定をカスタムする【Blender】
PAGE TOP