前回の続き。
前回は子の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件までしか登録できません」となります。
モデル制御でのメリットとデメリット
モデル制御でのメリット
- Railsの基本機能である
- Javascriptよりも簡単に実装できる
- Javascriptでの制御は、将来的に保証されない可能性もあるので、こちらのほうが確実
- cocoon以外のパッケージに切り替えた場合でも対処できる
モデル制御でのデメリット
- 「登録」ボタン押下時にチェックをするため、余計に入力するリスクは有る
- エラーが発生した場合、削除ボタンを押して行を減らすしかない
メリット・デメリット、どちらを優先するか悩ましいところではある
この手法はRailsの基本機能であることから、メリット・デメリットを説明し、納得してもらうことになりますが、うるさいクライアントもいると思います。
その場合のJavascript(JQuery)の手法については、次回にまわしたいと思います。
次回
次回は、それ以外の方法について考えていきます。