LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

メモ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1