Rails Diary

プログラミングの学習記録です。

日記(3)お蔵入り質問メモ

ごちゃごちゃ備忘録日記

※文章量多い
せっかくだから質問を利用しようとしたら、まとめている内になんとなく分かったのでやめました🌝 質問をまとめるのに時間がかかったので、当時こんな疑問を持っていたということでここに記録しておきます。 (※主観で自己完結しているだけなので、何か間違えている箇所もあるかもしれない)

あらまし

  • <div id><div class>の違いは?
  • 自分が書いたform_withのfを使わないエラーメッセージ表示はダメなのか。
  • object: f.objectという書き方がピンに来ない。どういう意味なのか。

    <div id><div class>の違いは?

    【イラスト解説】divに付いているidとclassの意味と使い方 | webliker

  • idとclassはほとんどcssのためにある

  • 特定の要素にcssを適用したい時に使う
  • id名とclass名をつけることで、ある要素にのみcssを適用させたい時など、セレクタとして扱うことができる

  • idは一つのHTMLページに同じidが存在するのはNG

  • 同じサイトでも別のページであれば同じidが存在しても構わない
  • idをつけた要素をセレクタにする場合、開始はドットではなく#を使う
  • classは同じページ内に複数ok
  • idとclassそれぞれにcssが指定されていた場合、idが優先される
  • javascriptを使う時はidの方がコンピューターの処理速度が早い
  • 基本的に使うのはclassで良い

自分が書いた記述はダメなのか?

多分ダメなことはないだろうけども、フォームに入力された内容に対してエラーメッセージを出すという点で、form_withdで回されたformを用いてパーシャルを完成させるのが、一般的なのではと思う。思っただけなので、実際は違うかもしれない。ただ深く掘り下げるような点でない気がしたので、そのままにしておく。

object: f.objectという書き方について

最初この書き方が全くピンと来ずに困った。form_withで回されたfに対して呼び出しているobjectメソッド的なものがあるのかと思い、検索やコンソールを使って調べるも、そんなメソッドはなかったとわかる。

「パーシャル内で使うobjectという値に、form_withで回されてきたfのobjectを代入するという意味」だと分かる。

<%= form_with model: @user, local: true do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

↑「挿入されている部分テンプレート内では、入力フォームに入力された@userオブジェクトを利用する」という記載

あらぬ方向に深読みしてしまい、f.labelやf.text_fieldのように何かしらを生成するものなのかと思い込んでしまった。

ちなみにobject: @userという形で書いてもエラーメッセージは表示されたが、フォームに入力された内容に対して、エラーメッセージを表示するという点で、やはりf.objectと書いた方が良いのかなと思った。

以下質問内容

質問内容
  • 自分が書いた記述でも問題点は?
  • 解答にあったf.objectが何を表すのか分からなかったため知りたい。
  • <div id="error_message">のようにdiv内にIDを記載するときとしない時の違いは?
    1. 自分が書いた処理

    フォーム画面のパーシャルがあり、エラーメッセージのパーシャルがあり、いずれも掲示板の新規作成画面にレンダーすれば分かりやすいのではと思い下記のように記述しました。

# app/views/boards/new.html.erb
<div class="container">
  <div class="row">
    <h1><%= t('.title') %></h1>
    <%= render 'layouts/error_message', model: @board %>
    <%= render 'form', board: @board%>

↑エラーメッセージのパーシャルはlayouts配下にしてしまったのですが、これまで作ってきたパーシャルはいずれもshared配下だったのでこちらも揃えるべきでした。

# _error_messages.html.erb
<% if model.errors.any? %>
  <div class="alert alert-danger ">
    <ul class="mb-0">
      <% model.errors.full_messages.each do |message| %>
        <li><%= message %></li>
    </ul>

この書き方でもエラーメッセージが表示されたのですが、良くない点はありますか?

2. object: f.objectという記述について

解答を確認して、フォームで入力された値に対してエラーメッセージを出すのだから、form_withで回されたfをオブジェクトとして渡すのだと理解しました。

<%= form_with model: @user, local: true do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="form-group">
    <%= f.label :last_name %>
<% if object.errors.any? %>
    <div id="error_message" class="alert alert-danger">
      <ul class="mb-0">
        <% object.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
<% end %>

自分の認識としてはobject: f.objectで@userが渡されるのだと思っているのですが、f.objectという書き方がいまいちピンときませんでした。ビューごとにレンダーの記載をするのであれば、object: @userと書いて良い気がするのですが、formのオブジェクトという意味でf.objectと書く方が一般的なのでしょうか?

3. div内に記載するidについて

課題9

<input class="form-control" type="text" name="board[title]" id="board_title" /><%= f.text_field :last_name, class: 'form-control' %>

<textarea class="form-control" row="10" style="height: 200px" name="board[body]" id="board_body"></textarea><%= f.text_field :first_name, class: 'form-control' %>
試したこと
  • form_withで回されたfに対して呼び出すobjectメソッドのようなものがあるのかと思い、検索してみるもそれらしいものが見つからない。
  • コンソールでBoardのインスタンスを作成して、objectメソッドを呼び出してみた。 →objectメソッドがあるわけではないと分かった。

  • object: f.@user object: f.user object: @userを全部試してみた。 →前二つはそれぞれ文法、未定義エラーになり、三つ目はエラーメッセージが表示された。

参考にしたURL

バリデーションのエラーメッセージの個別表示 Railsドキュメント render