rubyチュートリアル12章 メモ
//
隠しフィールド
form_for
を利用したフォーム内に隠しフィールドを設定する。
<%= form_for(@user, url: password_reset_path(params[:id])) do |f| %> <%= render 'shared/error_messages' %> <%= hidden_field_tag :email, @user.email %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.submit "Update password", class: "btn btn-primary" %> <% end %>
隠しフィールドの定義の仕方で値へのアクセス方法が変わる。hidden_field_tag :email, @user.email
とした場合、params[:email]
でアクセスでき、f.hidden_field :email, @user.email
とした場合、params[:user][:email]
となる。
時間の比較
checkpoint_at < 2.hours.ago
checkpoint_at
はdatetime。< 記号を「〜より早い時刻」と読む。"checkpoint_atが現在時刻より2時間以上前 (早い) の場合"にはtrue
となる。個人的には2時間より先(<)(遠く)にチェックポイントの時間があると読むとしっくりくる。(遠近法で遠いと小さいみたいな)
errors.add
バリデーションに対するエラーを出力する方法として準備されている。
Active Record バリデーション | Rails ガイド
デフォルトでは下のような使い方をするが、チュートリアルでは予め決められた表示形式を利用する形を使った。
user.errors.add(:password, "は以下の文字を含むことができません !@#%*()_-+=")
バリデーション失敗時に上のコードを書いて再描画させることで間違いがあったフォームがハイライトされる。おそらく、name属性値から繫がりを調べてフォームを特定していると思われる。ちなみにform_with
を用いて生成したフォームは下のhtml
に変換されて出力されいた。
<%=form_with model: @user, url:password_reset_path(params[:id]), local:true do |f|%> ... <%= f.password_field :password, class: "form-control"%> #変換後 <input class="form-control" type="password" name="user[password]">