メモ
form_for の method の決定基準
レコードがすでに DB 上にあるかどうかを見ているらしい。
Railsは、form_for(@user)を使ってフォームを構成すると、@user.new_record?がtrueのときにはPOSTを、falseのときにはPATCHを使います。
target="blank" のセキュリティリスク
新しく開いた側のページから、元ページの window オブジェクトにアクセスできてしまう。
参考: http://yoru9zine.hatenablog.com/entry/2017/03/17/230729
認可の制御
before_action
を使うとよい。
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update]
.
.
.
private
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in."
redirect_to login_url
end
end
end
redirect のタイミング
こういうコードでも、ちゃんと session.delete
は実行される。
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
これは、リダイレクトが行われるタイミングがメソッドの return 時点だから。
DB の初期化には db/seeds.rb を使う
見出しの通り。db/seeds.rb 内では普通に create
等でレコードを作ればよい。
その後 rails db:seed
する。
ページネーションには will_paginate gem が便利
- view で表示させたいリストを、普通に (
User.all
などで) 作るかわりに、User.paginate(page: params[:page])
のようにして作る- すると、今回のページに表示する分だけのリストを返してくれる
- 今回の例では User 全体に対して paginate を呼び出すしかしていないが、当然
User.where('id > 50').paginate(page: 3)
のようにもできる- この場合、id が 50 より大きいレコード群の 3 ページ目を返す
- view 側ではふつうに
each
等で要素を並べて表示すればよい- さらに、
<%= will_paginate %>
を書くことでナビゲーションを描画できる
- さらに、
render の新しい呼び方
<%= render user %>
このように render を実行すると、user
が User クラスのインスタンスなので、_user.html.erb
を探して描画してくれる。変数名 user
は関係ないことに注意。
それどころか、User クラスのインスタンスを収めた配列 users
を作って
<%= render users %>
のように render に渡すと、配列を展開して、1つ1つの user に対して前述の <%= render user %>
を実行してくれる。
なお _user.html.erb の中では
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
</li>
のように user
という変数が使えるようになっている。この辺は規約で決まっているのだろうか。
boolean のカラムの特徴
例: admin という boolean 型のカラムを作ったとする
- admin? というメソッドが生える
- toggle! というメソッドが生える