confirm_destroy_message: 小林研 Rails Tips (18)

はじめに

Rails Tips の 18 回目です。昨日のものと趣旨は同じで、コントローラの日本語記述を減らすためのヘルパメソッドです。今回は、削除の時の確認メッセージのヘルパーです。

事前準備: I18n の設定

また、config/locales/ja.yml には以下のように前回と同じように ja.confirm.destroy のメッセージを用意しています。

ja:
  (中略)
  ### 削除確認
  confirm:
    destroy: "%{obj}を削除してよろしいですか?"

confirm_destroy_message

昨日とやることは同じで、confirm_destroy_message(Kurasu)のようにします。

  # @param [Class] klass 表示するクラス
  # @return [String] 表示する notice message
  def confirm_destroy_message(klass)
    I18n.t "confirm.destroy", **{obj: klass.model_name.human}
  end

実はこのメソッドは以前は直接使っていたのですが、初日に紹介した Turbo Frame と組み合わせて使うことが多く、さらに上位の confirm_destroy メソッドから使われるだけになっています。Rails 7 からは data: { turbo_confirm: "メッセージ" }の形で書く必要があることや data: { turbo_frame: "フレーム名" }と組み合わせることも多いためです。

  # @param [Class] klass 表示するクラス
  # @param [String, nil] turbo_frame Turbo Frame 名
  # @return [Hash] Turbo Frame 用の Hash (data あり)
  def confirm_destroy(klass, turbo_frame: nil)
    ans = {data: {turbo_method: :delete, turbo_confirm: confirm_destroy_message(klass)}}
    ans[:data][:turbo_frame] = turbo_frame if turbo_frame
    ans
  end
  helper_method :confirm_destroy

これによって以下のような形で削除リンクが作成できるようになりました。

link_to "削除", teacher_kurasu_path(@kurasu), confirm_destroy(Kurasu)

おわりに

confirm_destroy により日本語の確認メッセージを書く必要がなく、削除リンクが簡単に設定できるようになりました。本番ではさらにこの link_to 自体ももっと簡単に書けるようになっているのですが、それはまた先の話ということで。