質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

978閲覧

文字数のチェック方法

pancho

総合スコア12

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2020/03/21 02:55

前提・実現したいこと

社内で使うPDFなどのファイル名で、下記の様な感じで文字数制限、半角/全角などを統一したいと思い
文字チェックアプリなる物を作りました。

作成日 + ファイル名13文字
20200321 会議の報告書 営業
←作成日→ ← 13文字  →

発生している問題・エラーメッセージ

ファイル名 + 部署名 で13文字になるように作っていたのですが
部署名を抜いてファイル名を作る方も居て
その方からは「部署名抜きで13文字が良い」との案が有り
変更しようと考えています

該当のソースコード

Model

1class Check < ApplicationRecord 2 validates :datenen, presence: true 3 validates :dategatu, presence: true 4 validates :datehi, presence: true 5 validates :title, presence: true, length: {maximum:11}, format: { with: /\A[^ァ-ン゙゚ 0-9]+\z/ } 6 validates :department, presence: true 7end

View

View

1<h1>下記に入力してください</h1> 2 3 <%= form_with(model: @check, local: true) do |f| %> 4 <% if @check.errors.any? %> 5 <div id="error_explanation"> 6 <ul> 7 <% @check.errors.full_messages.each do |msg| %> 8 <li><%= msg %></li> 9 <% end %> 10 </ul> 11 </div> 12 <% end %> 13 14 <div class="form-group"> 15 <%= f.label :date, '西暦年月日' %> 16 <%= f.select :datenen, [["2020", "2020"], ["2021", "2021"]], :prompt => "年" %> 17 <%= f.select :dategatu, [["01", "01"],["02", "02"],["03", "03"],["04", "04"],["05", "05"],["06", "06"],["07", "07"],["08", "08"],["09", "09"],["10", "10"],["11", "11"],["12", "12"]], :prompt => "月" %> 18 <%= f.select :datehi, [["01", "01"],["02", "02"],["03", "03"],["04", "04"],["05", "05"],["06", "06"],["07", "07"],["08", "08"],["09", "09"],["10", "10"],["11", "11"],["12", "12"],["13", "13"],["14", "14"],["15", "15"],["16", "16"],["17", "17"],["18", "18"],["19", "19"],["20", "20"],["21", "21"],["22", "22"],["23", "23"],["24", "24"],["25", "25"],["26", "26"],["27", "27"],["28", "28"],["29", "29"],["30", "30"],["31", "31"]], :prompt => "日" %> 19 </div> 20 21 <div class="form-group"> 22 <%= f.label :title, 'タイトル' %> 23 <%= f.text_field :title, size:"23" %> 24 </div> 25 26 <div class="form-group"> 27 <%= f.label :department, '部署' %> 28 <%= f.select :department, [["営業", "営業"],["業務", "業務"], ["経企", "経企"], ["事長", "事長"], ["庶務", "庶務"], ["情処", "情処"], ["人事", "人事"], ["総務", "総務"]], :prompt => "部署名" %> 29 </div> 30 31 <%= f.submit '作成' %> 32 <% end %> 33 34<p class="text-center"><%= link_to 'TOPに戻る', root_path %></p>

show

1<h2>ファイル名が作成されました</h2> 2<%= link_to '修正する', edit_check_path(@check) %> 3<% mozi = @check.datenen + @check.dategatu + @check.datehi + ' ' + @check.title + ' ' + @check.department %> 4<!-- コピー対象要素とコピーボタン --> 5<h4> 6 <div class="container-fluid mx-0"> 7 <div class="form-group row"> 8 <input class="border border-info rounded text-secondary form-control-plaintext col-10" id="omakeCopyTarget" type="text" value="<%= mozi %>" readonly> 9 <button type="button" class="btn btn-info col" onclick="omakeCopyToClipboard()" data-toggle="tooltip" data-placement="top" title="コピーする"> 10 <i class="fas fa-clipboard"></i> 11 </button> 12 </div> 13 </div> 14</h4> 15<script> 16 function omakeCopyToClipboard() { 17 // コピー対象をJavaScript上で変数として定義する 18 var copyTarget = document.getElementById("omakeCopyTarget"); 19 // コピー対象のテキストを選択する 20 copyTarget.select(); 21 // 選択しているテキストをクリップボードにコピーする 22 document.execCommand("Copy"); 23 // コピーをお知らせする 24 alert("コピーできました! : " + copyTarget.value); 25 } 26</script> 27<p class="text-center"><%= link_to 'TOPに戻る', root_path %></p> 28

試したこと

バリデーションで
validates :title, presence: true, length: {maximum:11}, format: { with: /\A[^ァ-ン゙゚ 0-9]+\z/ }
validates :department, presence: true
としていた所から
title の文字数を13に変え
validates :department, presence: true
をけし、入力してもしなくても良いようにしたのですが
それではぬしょ名を入れた時に文字数がオーバーしてしまうので
出来れば title と department を合わせた文字数で制限をかけたいと思うのですが
調べても方法が見つかりません。
良い方法を知っている方がいましたら教えていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

開発環境
AWS9
Rails5.2.4.1

プログラミング歴
6ヶ月

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単独の validates では難しいでしょうね

validate :title_department_length def title_department_length "#{title}#{department}".size <= 13 end

とするのがわかりやすいかと

投稿2020/03/21 07:01

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pancho

2020/03/24 04:25

そう言ったvalidatesの付け方もできるのですね 勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問