20201004_アウトプット
今日学んだこと(チャットアップのメッセージ投稿機能の実装)
form_withについてやっと意味がわかった!!!
form_with自体、Rails5.1から追加されたメソッド。それまでは、データを保存する場合には「form_for」を、保存する必要がない時は、「form_tag」を使い分ける必要があった。
form_withになってからは、引数の書き方を変えるだけでどちらの意味も、同じメソッドで記述できるようになった。具体的には、データを保存する場合には、「model指定」を、データを保存する必要がない場合には「url指定」を行う。
「url指定」では、リクエストを送信するパスとHTTPメソッドを指定する。(HTTPメソッドの初期値は「:post」、その場合には省略可能。)
<%= form_with url:"/posts", method: :post, local: true do |form| %> ↑ フォームの内容をここに記載 ↓ <% end %>
「model指定」は、コントローラーと密接に関わっている。コントローラーにおいてモデルを使ってインスタンスの生成を行うと思うが(例:@tweet = Tweet.new)そこを拾って、何も情報を持っていなければcreateアクションへ、すでに情報を持っている場合にはupdateアクションへ自動的に振り分けてくれる。
ビューのform_withで使うためにも、モデルから作成したデータは、インスタンス変数に代入する必要がある。
<%= form_with model: モデルクラスのインスタンス do |form| %>
- また、コントローラーがネストしている時には、パラムスが絡むため[ ]となる。
<%= form_with model: [@article, @comment] do |form| %>
- そのほかのform_withでわからなかった所は、「class」は単純にクラス名を指定していることと、「local:true」はHTMLとしてフォームを送信する際に指定が必要となるものだったこと(「local:true」を入れないと、デフォルトではAjaxによる送信となる。アプリケーションによって、このオプションをつけるかどうか使い分ける。)
deviseのマイグレーションファイルの「null: false, default: ""」について
- deviseでマイグレーションファイルを作成した時に、「default: ""」と入るが、「空で保存できない」のに「デフォルトで余白作らない」って矛盾してる?なぜ?と意味がわからなかった。
t.string :name, null: false t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: ""
結論は「devise」に聞かないとわからないだった。(メンターさんに聞いても意図不明だった。)
自分で後から追加した「name」には「default:""」がなくても平気なので、同じようになくても問題ないが、デフォルトで作成される「email」「password」のマイグレーションファイルは、(その2項目を使うのであれば)いじらないのが原則なのでそのままにする。
個人的な予測としては、空欄では保存できないことと、予期せぬ余白を入れたまま登録を防ぐ意味があるのかなと思った。
CSSでブロック要素が崩れた時の今回の解決法(探し方が勉強になった)
(1)要素が崩れている場合には「divタグが多い・少ない」を疑う。(その際に、対象の部分テンプレートだけでなく、左上の要素から読み込まれるので、そちらも疑う。)
(2)このdivのせいではないか?と思った時に、そのカタマリをいったん消して、ビューで見てみて、原因なのか探るのもあり。
DBの情報をビューに反映させる方法
(1)form_with(modelオプション)でデータを保存
(2)データを表示されるビュー(部分テンプレート)を作成(その際、今回は指定したインスタンス変数の中にある要素の数だけ、部分テンプレートが繰り返し表示されるrenderメソッドのオプションである「collectionオプションを使用」)
<%= render partial: 'hoge', collection: 繰り返し表示する要素が入っているインスタンス %>
データの投稿時間を日本時間に直す方法
(1)config>application.rbを編集
#追加する config.i18n.default_locale = :ja config.time_zone = 'Tokyo'
(2)config>locales>ja.ymlを編集
ja: time: formats: default: "%Y/%m/%d %H:%M:%S"
(3)ビュー側で、l(エル)メソッドという日付や時刻を表示するRailsのメソッドを指定する。
<div class="message-date"> <!-- 投稿した時刻を出力する --> <%= l message.created_at %> </div>
(4)サーバーを再起動すれば反映される。
その他
- dependentオプションを使うと、親モデルを削除した時、関連しているモデルの挙動をどうするか指定できる。
積み残し(わからないところ)
- <%= form_with(model: @tweet, local: true) do |form| %>※モデル →解決!
deviseに関するマイグレーションファイルは書き方がビューに影響する?(名前、Eメール、パスワードがあったとして、ユーザーに入力してもらいたい順番で書かないと順番異なるのか?) →解決! (結果)マイグレーションの書いた順は、 シークエルプロのカラム順に影響。ビューへの影響は、シンプルにビューファイルでどのように書くかだった。