Railsチュートリアル

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

メモ

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