😎

編集ページでは変更できないフォームを作る

に公開

こんにちは。関口です!

今回の記事では、Rails のフォームヘルパーである form_for や form_with を利用してフォーム画面を作成する時に、保存済みのオブジェクトの特定のカラムを変更させないようにするための実装を紹介していきます。

経緯

作成済みのオブジェクトを編集画面から編集しようと思った際に、特定のカラムだけは更新したくない場合がありました。
新規作成画面と編集画面で共通のフォームテンプレートを利用している場合に、編集画面のみで値の入力を制御したい場合にどのような実装になるのか少しつまずいたため、その解決方法を紹介していこうと思います。

鍵となる persisted? メソッド

今回の実装の鍵となるのは、ActiveRecord が提供してくれている persisted? メソッドです。
persisted? メソッドは、 ActiveRecord オブジェクトが保存済みかどうかをチェックしてくれます。

user = User.new
user.persisted? => false

user = User.create
user.persisted? => true

参考: https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

この persisted? メソッドを用いて、特定のカラムを変更させないように実装しました。

  • フォームで利用しているオブジェクトが保存済みかどうかを判定
  • 保存済みの場合は、入力フォームを非活性にする
  • 保存済みでない場合は、入力フォームを活性にする

フォームの活性、非活性には フォームフィールドの disabled オプションを利用します。

具体的には以下のような実装です。

= f.number_field :price, disabled: f.object.persisted?

編集画面で変更させたくないカラムに対して上記のように実装することで、更新できないようになりました。

思いついてしまえば簡単な実装ですが、persisted? メソッドを知らなかった自分にとってはつまずいたポイントだったため記事として紹介させていただきました!

最後まで読んでいただきありがとうございました!!

ラブグラフのエンジニアブログ

Discussion