今日は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 インスタンスを渡す。
コメント