ruby チュートリアル10章 メモ
form_for(@user)
の判定
form_for
を利用すると自動で入力フォームとそのsubmit先の設定等を設定し表示できるようにしてくれる。一般にcreate
アクションとedit
アクション用のフォームは同じform_for(@user)
で生成される。このアクションの違いは@user内のnew_record?
論理値メソッドを使用して判定している。その結果true
ならPOST
をfalse
ならPATCH
をリクエストに使用する。
$ rails console >> User.new.new_record? => true >> User.first.new_record? => false
認証と認可
認証(authentication)はユーザを識別すること、認可(authorization)はそのユーザが実行可能な操作を管理すること。
unless
if
文がtrue
の際の処理を書くなら、unless
文はfalse
の際の処理を記述する。
before_action
すでに定義されているアクション実行前に作動する。登録してあるユーザのみ実行させるなどの認証をここで指定できる。only:
を使用すると指定したアクションでのみ、before_action
が作動するようになる。
リダイレクトの発生タイミング
チュートリアルでは下のようなコードが出る。これは別ページでセッションに移動先を保持させておいて、このメソッドを使用してリダイレクトを発生させる。(引数は無視) この場合、リダイレクトの発生タイミングは最終行のコードが実行されてからになる為、リダイレクトも発生するがセッション削除も行われる。リダイレクトの発生タイミングは最終行のコードの実行後か明示的にreturn
を呼ばれた時になる。
#app/helpers/sessions_helper.rb def redirect_back_or(default) redirect_to(session[:forwarding_url] || default) session.delete(:forwarding_url) end
request.get?
送られてきたリクエストがGET
かどうか判定できる。チュートリアルでは下のように使用して、GET
リクエストの時だけ、URL
をセッションに退避させておき、必要になった時にリダイレクトで飛ばせるようにしている。UPDATE
やPATCH
等が飛んできた時にそれを退避してしまわないよう、GET
のみに絞っている。
#app/helpers/sessions_helper.rb session[:forwarding_url] = request.original_url if request.get?
ページネーション(pagination)
ユーザ一覧を1ページにずらっと並べると見にくいので、それを10人ずつ表示したりすること。チュートリアルではgem 'will_paginate'
を使用する。
導入後、下のように確認が可能。
@users = User.paginate(page: params[:page])
デフォルトでは30人ずつ取り出され、page
はそのインデックス番号を指定。nil
が届いた場合は、1ページ目が自動で指定される。
パーシャルの利用
下のコードはhtmlタグをパーシャルを利用して上手く表示する例。
#app/views/users/index.html.erb #before <ul class="users"> <% @users.each do |user| %> <li> <%= gravatar_for user, size: 50 %> <%= link_to user.name, user %> </li> <% end %> </ul> #after <ul class="users"> <% @users.each do |user| %> <%= render user %> <% end %> </ul>
肝心のパーシャルの部分は、_user.html.erb
ファイルを自動で探しに行くのでそこに定義してやる。
<li> <%= gravatar_for user, size: 50 %> <%= link_to user.name, user %> </li>
この時、下のようにすれば更にeach
の部分も省略可能になる。
<ul class="users"> <%= render @users %> </ul>
RailsはこれをUser
オブジェクトのリストであると認識、それぞれをパーシャルとして書き出してくれる。すごい。