セキュリティ系の勉強・その他開発メモとか雑談. 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オブジェクトのリストであると認識、それぞれをパーシャルとして書き出してくれる。すごい。