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メール、パスワードがあったとして、ユーザーに入力してもらいたい順番で書かないと順番異なるのか?) →解決! (結果)マイグレーションの書いた順は、 シークエルプロのカラム順に影響。ビューへの影響は、シンプルにビューファイルでどのように書くかだった。



感想

  • ずっとモヤモヤしていたform_withについてすっきりしたので嬉しかった!!

  • 早くカリキュラムを進めて、自分でアプリケーション作った上で、さらに理解を深めたい。

  • アマプラで「インターステラー」を観た。SFっぽいのに現実的で、面白かった!!!(物理学について、毛嫌いしていたけれど、もっと知りたいと思えるほど、わかりやすくて引き込まれる映画だった!アインシュタインの考えがわかるような本読みたい。)

  • 8/1以降、軽く散歩などには出かけるものの、土日の時間についてずっとプログラミングに費やしていた。たまには、リフレッシュできるので、ご褒美に映画もいいなと思った。