TECH::CAMPで学習中に戸惑ったところをメモ。
公式リファレンスを読み込んだわけではないので間違っているところもあるかもしれない。
tl; d
- index, show, new, editのアクションには何も書かなくてもいい。
- form_withはモデル名とカラム名で指定すればいい。
- link_toはPrefixでインスタンスを渡せばいい。
Railsが自動でやってくれる
index, show, new, editのアクションには何も書かなくてもいい
def index
end
def show
end
def new
end
def edit
end
7つのメソッドの中でも、この4つは最低限これだけ書けば動いてくれるみたいでびっくり。
ビュー側にデータを送るために、アクティブレコードメソッドを使って、インスタンス変数を宣言して……と基礎コースで勉強したみたいに用意していたのはなんだったの。
たしかに、これらのアクションはURLやPrefixでアクションを指定した時点で、該当するモデル(show, editの場合は加えてid)のインスタンス変数を用意するのはほぼ確定してる。
なので書かなくても自動でインスタンス変数も用意しておいてくれてるということか。
ただし、表示順序を入れ替えるだったり、N+1問題を回避するためにincludeで関連モデルを読み込むだったり、JavaScriptと連携したり、などの場合は相応の記述をする必要がある。
form_withはモデル名とカラム名で指定すればいい。
<%= form_with(model: @tweet, local: true) do |form| %>
<%= form.text_field :name, placeholder: "name" %>
<%= form.text_area :text, placeholder: "text" , rows: "10" %>
<%= form.submit "SEND" %>
<% end %>
渡されたインスタンスがレコード内にあるかを自動判定してくれるので、どのアクションに向けてデータを送るかのパスを書かなくていい。
こうすることで、newのビューとeditのビューでformのコードをそのまま使いまわせるという。
ただし、form_withにこれはnewのインスタンスですよ、と知らせるためにnewアクションでnewする必要があるみたい。
form.text_field :name
などの個別の入力フォームを生成している部分では、カラム名を指定しておくと、どのカラムに保存するかも勝手にやってくれる。
しかも、このカラム名のシンボルがHTMLに変換された際にid = "name"
の様に変換されるので、JavaScriptで使う用にidを設定しなくても、そのままdocument.getElementById("name")
で指定できて便利。
link_toはPrefixでインスタンスを渡せばいい。
<% rooms.each do |room|%>
<%= link_to room.name, room_messages_path(room), method: :get%>
<% end %>
Prefixはインスタンスを指定できるのでいちいち "rooms/destroy/#{room.id}"
の様に数値に変換したり、式展開する必要もない。
URIパターンを定数化した様なものかな?と思っていたけど、引数っぽいのを指定できるPrefixって何者?メソッド?