【Rails:6】コントローラとビュー(応用編)

セッション

  • セッション
    あるユーザからのリクエストを、他ユーザのものと区別するための接続情報。
    通常サーバは、複数のリクエストを受け取ったとき、すべて独立したものと見なします。
    ユーザのログイン状態を保持したい場合などは、ユーザとサーバの接続状態を保つ仕掛け=セッションが必要なのです。
    • クッキー
      ブラウザがハードディスクに保存する情報。
      Railsでは、初めてアクセスしてきたユーザに対し、セッションIDをクッキーとして発行します。
      ブラウザはこれを保存し、次回以降アクセスする際に、HTTPヘッダに含めて送信します。
      サーバは、送られてきたクッキーをもとにユーザを判別します。
  • セッションデータの扱い
    Railsでは、session[:データ名]の形で簡単にセッションデータを扱うことができます。
    複数のデータ名を用意すれば、複数のデータをセッションに持たせることもできます。
session[:user_id] = user.id
# セッションデータにユーザオブジェクトのIDを付与

id = session[:user_id]
# 現在アクセスしているユーザのセッションデータを変数idに取得

session[:user_id] = nil
# セッションを無効化(ログアウト処理etc.)
  • セッションストレージ
    セッションの管理方法は、config\environment.rb あるいは config\environments\***.rb にて設定可能です。
    • ファイルストア(WEBサーバのハードディスク上=tmp\sessions以下)に保存…1.x デフォルト
      【メリット】扱いが簡単
      【デメリット】ファイル数が増える・複数のサーバでセッションを共有できない
ActionController::Base.session_store = CGI::Session::PStore
    • データベースに保存
      【メリット】複数のサーバでセッションを共有できる
      【デメリット】テーブルが肥大するとデータベースに負荷がかかる
ActionController::Base.session_store = :active_record_store
$ rake db:sessions:create   # セッションデータ用テーブルを追加するマイグレーション生成
$ rake db:migrate
    • クッキーにファイルストアの内容を格納…2.x デフォルト
      【メリット】サーバへの負荷がない
      【デメリット】セッションデータ構造変更で不具合が起きる・携帯端末に対応していない
# クッキーに関するオプションの変更
ActionController::Base.session_options[:session_path] = '/app_name'
キー
:session_domain クッキーを読み書きできるドメイン
:session_path クッキーを読み書きできるパス名
:session_expires クッキーの有効期限
:session_secure trueなら、HTTPSプロトコルのみクッキーの読み書きを許可
:session_id セッションID
:session_key セッションID用のクッキーのデータ名
  • パスワードの扱い

プラグイン

ページネーション

  • ページネーション
    WEBページで大量のデータを表示する際、一定数ごとにページを分けて表示する仕組み。
@pages, @mdlnames = paginate(:mdlnames,                     # テーブル名
                             :order => order,               # ソート基準
                             :per_page => per_page,         # 1ページあたりのオブジェクト数
                             :conditions => [conditions])   # 検索条件

または

@mdlnames = MdlName.find(:all,
                         :order => order,
                         :conditions => [conditions],
                         :offset => (current_page - 1)*per_page,   # 現在のページで表示するオブジェクトの始点
                         :limit => per_page)                       # 1ページあたりのオブジェクト数
@pages = Paginator.new(controller,     # コントローラオブジェクト
                       total,          # オブジェクトの総数
                       per_page,       # 1ページあたりのオブジェクト数
                       current_page)   # 現在のページ番号
<%= pagination_links(@pages, :params => params) %>

画像処理

  • MySQLでの画像保存
    MySQLデータベースに画像を保存するには、フィールドのデータ型を画像用のものにします。
最大サイズ
binary 64KB
mediumblob 16MB
longblob 4GB
    • 64KBを超える画像の保存
      create_tableメソッドやadd_columnメソッドでは、DBMS固有のデータ型を指定できないため、mediumblob型やlongblob型の指定は直接sql文で行います。
      executeメソッドを使えば、マイグレーションスクリプトsql文を直接記述できます。
def self.up
  ...
  ...
  execute "alter table mdlnames modify column clmname LONGBLOB;"
  # mdlnamesテーブルのclmnameフィールドをlongblob型に変更
end
  • 画像ファイルの送信
    HTMLファイルの送信にはrenderメソッドを使用しましたが、バイナリファイルの送信にはsend_dataを使用します。
def image
  send_data(image_data,
            :type => 'image/gif',
                     # 'image/jpeg', 'image/png'
            :disposition => 'inline')
                            # 'inline' => ブラウザに表示
                            # 'attachment' => ダウンロード
end
<%= image_tag(url_for(:action => 'image') %>