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. 【Blender】MMDファイルをBlenderにImportするアドオン
  2. 起動時の設定をカスタムする【Blender】
  3. 【UE4】用語備忘録メモ
  4. 【CSS】おしゃれなラジオボタンを作る
  5. 【Blender】起動時に強制終了してしまう問題

関連記事

 
  1. Ruby on Rails

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

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

  2. Ruby on Rails

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

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

  3. Ruby on Rails

    【Rails】selectメソッドで特定の条件を満たす要素を取得する

    selectは、配列に対してブロック内の条件を評価し、真になって要素を…

  4. Ruby on Rails

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

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

  5. Ruby on Rails

    【Rails】Factory already registered: エラー

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

  6. Ruby on Rails

    【Rails】RSpecのお作法メモ

    RSpecを書く機会が増えてきたので、記法の備忘録として記事にします…

カレンダー

2024年3月
 123
45678910
11121314151617
18192021222324
25262728293031

最近の記事

  1. Blender

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

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

    【WPテーマ自作】ローカル環境でWP開発ができる「Local」の導入
  4. Ruby on Rails

    【Rails】railsでIndex name ‘xxx’…
  5. Ruby on Rails

    【Rails】modelを作成する
PAGE TOP