はじめに
Rails Tips の 38 回目です。Rails 自体には link_to_if
という条件によってリンクとテキストを切り替えるメソッドが存在します。従来これを使っていたのですが、権限などの判定も含めて全てパスだけで判定できるヘルパーである lotfp (link or title from path)を紹介します。頻繁に使用するものなので、名前は短縮しています。ただし、権限周りの部分はシステムによって異なるので、説明は省略します。
lotfp の使い方
行事日程設定のページをネタとして lotfp の使い方を説明します。一番簡単な使い方は単にパスを指定するだけです。
= lotfp teacher_events_path
イベント追加は以前 new action で実施していましたが、Turbo Frame 用に index 内で new_date を渡すだけに変更してみました。table を使っていなければ Turbo Stream にしてしまったのですが、そこまで改修する気になれなかったためです。パスは index のままなので、以下のようにタイトルを指定するようにしています。また、編集も同様です。
= lotfp teacher_events_path(new_date: d), title: "追加" = lotfp teacher_events_path(event_id: event.id), title: "編集"
イベントの複製である duplicate は method が patch なので、以下のようにメソッドを追記します。
= lotfp duplicate_events_path(date: d), :patch
その日付の出席簿表示は Turbo Frame の外に出る必要があるため、初回に紹介した dtf をオプションで指定します。
= lotfp shussekibo_teacher_lectures_path(date: d), title: "出席簿", option: dtf
lotfp の実装
lotfp は権限周りの細かい設定が必要であり、単体テストが記述できていないので、実装だけを掲載します。これまでに紹介した controller_action_and_params
, link_title_from_cap
などを使って、path
と method
からタイトルや権限を取得しています。ただし、title
でタイトルを上書きしたり、cond
で追加権限を設定することもできます。また、初回に紹介した dtf
などの turbo 系のオプションは option
で指定します。
# @param [Hash] session # @param [String] path # @param [Symbol, nil] method # @return [ActiveSupport::SafeBuffer] リンクまたは文字列 # @note lotfp -> link_or_title_from_path def lotfp(path, method = nil, cond: true, title: nil, option: {}) cap = controller_action_and_params(path, method) hp = controller.acp(privileges_from_cap(cap), cap) title ||= link_title_from_cap(cap) cond && hp ? link_to_lh(title, path, {data: {turbo_method: method}}.merge(option)) : title end
おわりに
現在のシステムで一番使っているヘルパーがこちらになります。これまで link_to で書いていたものに対し、権限周りの設定や locales を追加した上で lotfp に書き換えを行っています。locales からタイトルを取得しているためページごとの表記の揺らぎがなくなりますし、権限も行き先のコントローラから取得するので表示権限と実際の権限にずれが発生しなくなりました。