TECH EXPERT 12日目

TECH::EXPERT

今日はRailsのエラー問題をチームのみんなで解く時間。
これが終わったら午前のうちに帰宅しました。
なにせ渋谷の仮宿に10日以上もいるせいで、本拠地に長いこと戻っていない。

ここまで勉強してきたことのまとめ記事も作りたいので、デスクトップ環境の整っている自宅へ舞い戻りました。やっぱデスクトップはいいわ!画面が広いし、姿勢も負担の少ない姿勢でいられる。ノートだと画面が小さいのでどうしても猫背になってしまう。

やったことメモ(ほぼ何もやってない)

renderメソッド

ビュー(html)の呼び出しを行う時に使う。
部分テンプレートを呼び出す際だけでなく、別ページに飛ばしたい時にも使う。
類似の機能にredirect_toがある。
redirect_toの場合はアクションを実行後にビューに移るのに対し、
renderの場合はアクションを実行せずに直接ビューに移る。
具体的な使い方としては、静的なページにアクセスさせる際にはアクションを実行する必要がないためrenderを使う。

render partial:tweet, collection @tweets

@tweets.each do |tweet|
  render partial:tweet
end

上記の上と下はやっていることは同じであるが、処理速度が違う。
理由はeachで回す場合に部分テンプレートをeachの回数だけ繰り返し読んでしまうからだ。
collectionで渡す場合には1度しか呼び出されないので通常は上の書き方をする。
ちなみにpartial部分は自明の場合(tweet.html.erbと_tweet.html.erb)の場合は省略でき、さらにcollectionも省略できる。

render partial:tweet, collection @tweets
↑↓同じ意味
render @tweets

validationとnew/save

validationで未入力があった場合にどうやって再処理を促すか?
仮にformから返る値をcreateで作った場合、validationで撥ねた場合に処理が分岐できない。

実はsaveメソッドは成功するとインスタンスが返り値となるが、失敗すると(validationで撥ねる)とfalseが返ります。これを利用して、if インスタンス.saveと書くことで再入力を促すことができる。

if tweet.save
  redirect_to root_path
else
  render :new
end

form_for

form_tagにはインスタンスは必要ないが、form_for インスタンスを渡す。

コメント