Rails f.time_selectで時間だけを入力させたい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 50

kokotaro

score 6

やりたいこと

現在作成中のアプリで時間を投稿できるようにf.time_selectをhtmlに設置して時間セレクトフォームを作りました。
時間と分の入力項目(セレクトフォーム)で何も選択しないで送信するとバリデーションエラーにかかるようにしたいです。

問題点

バリデーションにpresence:trueをかけ入力必須にしていますが、
時間と分を未選択で送信してもエラーにならずに入力されてしまいます。

いざ、送信ボタンを押した時のパラメーターをログで確認すると

<%= f.time_select :created_at, prompt:true %>

送信されたパラメーター

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Dmc3gmFfOeCvM60K1t92TsylXoamtcbRaRmTAw3xfRmS16ODOD6w1f73+PceY/26PcmbxkZO3NxmU7GdlJN+zw==", "product"=>{ "created_at(1i)"=>"1", "created_at(2i)"=>"1", "created_at(3i)"=>"1", "created_at(4i)"=>"", "created_at(5i)"=>""}, "commit"=>"送信する"}


chromeの開発ツールで見ると

<input type="hidden" id="product_created_at_1i" name="product[created_at(1i)]" value="1">
<input type="hidden" id="product_created_at_2i" name="product[created_at(2i)]" value="1">
<input type="hidden" id="product_created_at_3i" name="product[created_at(3i)]" value="1">

<select id="product_created_at_4i" name="product[created_at(4i)]">
<option value="">時</option>
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
</select>

<select id="product_created_at_5i" name="product[created_at(5i)]">
<option value="">分</option>
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
<option value="37">37</option>
<option value="38">38</option>
<option value="39">39</option>
<option value="40">40</option>
<option value="41">41</option>
<option value="42">42</option>
<option value="43">43</option>
<option value="44">44</option>
<option value="45">45</option>
<option value="46">46</option>
<option value="47">47</option>
<option value="48">48</option>
<option value="49">49</option>
<option value="50">50</option>
<option value="51">51</option>
<option value="52">52</option>
<option value="53">53</option>
<option value="54">54</option>
<option value="55">55</option>
<option value="56">56</option>
<option value="57">57</option>
<option value="58">58</option>
<option value="59">59</option>
</select>

created_at(1i)..(5i)までのカラム?が存在します。
年が(1i)、月が(2i)、日が(3i)、時間が(4i)、分が(5i)です。
画面上表示されてるセレクトフォームは時間と分だけです。

自分の中では時間と分を未選択で送信しても年月日が1の値を送信してるので空として認識されいようになっていると考えています。

年月日の値を空にする方法を教えていただきたいです。

試したこと

f.time_fieldで実装したらバリデーションエラーにかかりましたが、ブラウザがchromeだと問題ないのですがfirefox、safariだとうまく動作しなかったのでtime_selectでの実装をしたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • no1knows

    2019/09/14 20:18

    「バリデーションにpresence:trueをかけ」など該当するコードの提示をいただくと回答がつきやすくなるかと思います。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる