セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

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]">