inuinu blog(開発用)

BOT @wagagun の開発ノウハウや、IT向け?の雑記ブログです。

【Ruby on Rails7】cocoonを導入(その6:子の件数にモデル定義のみで制限をかけたい)

この記事では、Ruby on Rails7のgemパッケージcocoonについて、導入・カスタマイズ行います。
今回は行追加時に、子の件数について、モデルの記述のみで制限をかける手法を考えます。

前回の続き。

inuinu-tech.hatenablog.jp

前回は子の0件を防ぎましたが、今回は子の件数に制限をかける方法を考えていきたいと思います。

やり方にはモデルで制御する方法と、Javascript(JQuery)側で制御をかける方法がありますが、今回はモデルで制御ををかけていきます。

モデルでの制御方法

モデルに実装する

モデルapp/models/project.rbに以下を追記します。

  # 子の上限
  MAX_TASK_LENGTH = 5
(中略)
  validates :tasks, length: {maximum: MAX_TASK_LENGTH}

これだけです。

これで、子の明細件数に制限をかけることができあます。
(上記例では6件以上入力するとエラーとなる。)

i18nに追記する(i18nをinstallしている前提)

バリデーションのメッセージには、「tasksは5文字までしか入力できません」となりますね。
これでは意味がわかりません。

config/locales/〜/ja.ymlに以下の行を追記します。
(すでにactiverecord:attributes:がある場合は、project:以降を追記してください。)

ja:
  activerecord:
    attributes:
      project: 
        tasks: 'タスク'
    errors:
      models:
        project:
          attributes:
            tasks:
              too_long: 'は%{count}件までしか登録できません'

これで「タスクは5件までしか登録できません」となります。

レイアウトによっては、「タスクは5行までしか登録できません」と「行」表現のほうが良いかもしれません。

モデル制御でのメリットとデメリット

モデル制御でのメリット

  • Railsの基本機能である
  • Javascriptよりも簡単に実装できる
  • Javascriptでの制御は、将来的に保証されない可能性もあるので、こちらのほうが確実
  • cocoon以外のパッケージに切り替えた場合でも対処できる

モデル制御でのデメリット

  • 「登録」ボタン押下時にチェックをするため、余計に入力するリスクは有る
  • エラーが発生した場合、削除ボタンを押して行を減らすしかない

メリット・デメリット、どちらを優先するか悩ましいところではある

この手法はRailsの基本機能であることから、メリット・デメリットを説明し、納得してもらうことになりますが、うるさいクライアントもいると思います。

個人的にはパッケージの機能を不完全だと言い、細かくいじりたがる日本のIT業界やクライアントは、だから海外に劣るのだと思っています。
(お金をかける部分はそこではないだろ…と思います。)

その場合のJavascript(JQuery)の手法については、次回にまわしたいと思います。

次回

次回は、それ以外の方法について考えていきます。

inuinu-tech.hatenablog.jp