ActiveModel::Modelのvalidateメソッドの命名


#1

ちょっとした命名の話ですが、自分ならこう命名するというような意見を伺いたいです。

class HogeForm
  include ActiveModel::Model

  attr_accessor :fuga_id

  validates :fuga_id, presence: true
  validate :fuga_is_present, if: :fuga_id

  private

  def fuga
    @fuga = Fuga.find(fuga_id)
  end

  def fuga_is_present
    return ture if fuga
    # バリデーションエラー処理
  end
end

上記のようなClassにおけるvalidateメソッドの命名についてです。

validate :fuga_is_present
validate that fuga is present
だと解釈する場合自然なのですが、メソッド名単体で見るとvalidateメソッドであることがわかりにくく感じます。

メソッド名をfuga_must_be_presentとすると、メソッド名単体ではvalidateメソッドだとわかりやすいですが
validate :fuga_must_be_present
となり、さっきと同様の英文に解釈すると下記の通り意味が通らなくなります。
validate that fuga must be present

どちらがより読みやすいでしょうか?
また、他にもやりようはあると思うので、「自分ならこうする」という意見をぜひ教えてほしいです。


#2

自分ならCustomValidatorsを使います。
app/validatorsディレクトリを作成してそこにファイルを追加していく感じですね。
https://guides.rubyonrails.org/active_record_validations.html#custom-validators


#3

回答ありがとうございます
あるClassのvalidateをすべてCustomValidatorsにまとめると命名にあまり悩まなくてすみそうですね

また、リンク先のrails guideでは

validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_greater_than_total_value

といったvalidate用メソッドを定義していたので、これに習い
Aは〜でなければならない
といったニュアンスが伝わるようなメソッド名にしようと思います


#4

見落としていましたが、これFormObjectですね。
自分ならこのFormObject限定のバリデーションを実装したい場合、
CustomValidatorsは使わずにFormObjectに書くと思います。(汎用的なバリデーションを除く)
rails guideのメソッド名でよさそうですね。


#5

僕はよく validate :fuga_should_be_present みたいに書いてました。英文的には should be よりは is のほうがよいんですかね…(英語弱

英語ネイティブなひとにこういうの質問したいですね


#6

ISO 規格に慣れてる人はshall を使いそうな気もするのですが、これが ISO 以外にも適用される、英語圏での一般的な用法なのかは自信がない/疑わしいですね…。

(上記は厳密にはこちらの Directives and Policies - ISO/IEC Directives Part 2 - 7 Verbal forms for expressions of provisions に規定があります)