【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 デフォルト
【メリット】扱いが簡単
【デメリット】ファイル数が増える・複数のサーバでセッションを共有できない
- ファイルストア(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 デフォルト
【メリット】サーバへの負荷がない
【デメリット】セッションデータ構造変更で不具合が起きる・携帯端末に対応していない
- クッキーにファイルストアの内容を格納…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) %>
画像処理
型 | 最大サイズ |
---|---|
binary | 64KB |
mediumblob | 16MB |
longblob | 4GB |
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') %>