0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsが自動でやってくれて助かるけどびっくりしたところ

Last updated at Posted at 2020-07-20

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はモデル名とカラム名で指定すればいい。

html.erb
<%= 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でインスタンスを渡せばいい。

html.erb
<% rooms.each do |room|%>
	<%= link_to room.name, room_messages_path(room), method: :get%>
<% end %>

Prefixはインスタンスを指定できるのでいちいち "rooms/destroy/#{room.id}" の様に数値に変換したり、式展開する必要もない。
URIパターンを定数化した様なものかな?と思っていたけど、引数っぽいのを指定できるPrefixって何者?メソッド?

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?