セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

ruby チュートリアル10章 メモ

form_for(@user)の判定

form_forを利用すると自動で入力フォームとそのsubmit先の設定等を設定し表示できるようにしてくれる。一般にcreateアクションとeditアクション用のフォームは同じform_for(@user)で生成される。このアクションの違いは@user内のnew_record?論理値メソッドを使用して判定している。その結果trueならPOSTfalseなら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をセッションに退避させておき、必要になった時にリダイレクトで飛ばせるようにしている。UPDATEPATCH等が飛んできた時にそれを退避してしまわないよう、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オブジェクトのリストであると認識、それぞれをパーシャルとして書き出してくれる。すごい。