Posted at

Rails チュートリアル メモ 第10章

More than 1 year has passed since last update.


メモ


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! というメソッドが生える