コントローラについて
layout: page
説明
モデルからデータを受け取り、ビューにレンダリングする仕組み
特徴
- コントローラには複数のアクションが含まれている
- コントローラの名前の付け方には決まりがある
規約
- 英大文字から始まる
- 英数字のみ
- 単語の区切りでは、先頭文字を大文字
- EntriesController
- UserCommentsController
- ファイルはapp/controllerディレクトリに格納
- ファイル名は、コントローラ名の単語区切りを「_」にし、すべて小文字にしたもの
- app/controllers/entries_controller.rb
- app/controllers/user_comments_controller.rb
雛形
class コントローラ名Controller < ApplicationController
def メソッド名
end
edn
パラメータの取得
layout: page
説明
URLから送られてきた値やフォームで入力した値
使い方
params[:パラメータ名]
特徴
- リンクによるパラメータの受け渡し
- フォームによるパラメータの受け渡し
例
リンクによるパラメータの受け渡し
ビュー
link_to 'ユーザ名', controller: 'users', action: 'show', id: =1 ##### コントローラ
def show
id = params[:id] # id = 1
end
フォームによるパラメータの受け渡し
ビュー
<% form_for @user do |f| -%>
名前:<%= f.text_field :name %>
説明:<%= f.text_area :body %>
<% end -%> ##### コントローラ
def create
name = params[:name]
body = params[:body]
end
配列でパラメータの受け渡し
xxx[]
ハッシュでパラメータの受け渡し
xxx[aaa]
その他
コントローラ名やアクション名の取得
params[:controller]やparams[:action]で、コントローラ名やアクション名を取得できる
アップロードされたファイルを取得
layout: page
説明
フォームからアップロードされたファイルを取得
使い方
ファイル名
params[:パラメータ名].original_filename
コンテンツタイプ
params[:パラメータ名].content_type
サイズ
params[:パラメータ名].size
ファイル本体の読み込み
params[:パラメータ名].read
例
アップロードファイルを取得
params[:file]
ファイル名を取得
params[:file].original_filename
拡張子の取得
params[:file].content_type
ファイルのサイズの取得
params[:file]
ファイル本体の取得
params[:file].read
ページのレイアウトを設定
layout: page
説明
- 使用するレイアウトを明示的に指定
- 指定しない場合は、app/views/layouts/コントローラ名.html.erbを使用
- app/views/layouts/コントローラ名.html.erbが無い場合は、app/views/layouts/application.html.erbを使用
使い方
layout レイアウト名
例
基本となる使い方
layout bank_standard
動的にレイアウトを変える
layout :writers_and_readers
private
def writers_and_readers
logged_in? ? "writer_layout" : "reader_layout"
end
特定のアクションのみにレイアウトを指定
layout weblog_standard, only: :rss
特定のアクション以外にレイアウトを指定
layout weblog_standard, except: :rss
表示させるviewファイルを指定して表示
layout: page
説明
表示させるviewファイルを指定して表示
使い方
render(表示方法 [, オプション])
表示方法
表示方法 | 説明 |
---|---|
:action | 他のアクションのテンプレートを表示 |
:partial | 部分テンプレートを呼び出して表示 |
:template | テンプレートを指定して表示 |
:text | 任意のテキストを指定して表示 |
:xml | 指定したテキストを表示し、コンテンツタイプをapplication/xmlに設定 |
:json | 指定したテキストを表示し、コンテンツタイプをtext/x-jsonに設定 |
:update | ブロックで処理を行い表示 |
:file | ファイルを指定して表示 |
:inline | ビューとするソースコードを直接指定 |
:plain | 平文テキストを表示 |
:html | HTML文字列を表示 |
:js | JavaScriptを表示 |
:body | 生のコンテンツを表示 |
オプション
オプション | 説明 |
---|---|
:content_type | content-typeを変更 |
:layout | レイアウトを指定 |
:location | HTTPのLocationヘッダーを設定 |
:status | ステータスコードを制御 |
:formats | フォーマット指定 |
注意点
- 同じアクション内でrenderメソッドを複数呼び出すと、エラーになるので、and returnを付ける
render :action
説明
他のアクションのテンプレートを表示
使い方
render(action: "アクション名" [, layout: レイアウト名])
例
「_new.html.erb」を表示
render action: "new"
他のレイアウトを使用
render action: "new", layout: "user"
レイアウトは使用しない
render action: "new", layout: false
render :template
説明
他のコントローラのテンプレートを表示
使い方
render template: コントローラ名/アクション名
例
他のコントローラのテンプレートを表示
render template: "user/show"
templateを省略
render "user/show"
render :file
説明
アプリケーション外のテンプレートを表示
「/」で始まる場合はファイル出力と認識するので、fileオプションは省略可能
使い方
render file: ファイルパス
例
「/common/template/index」を表示
render file: "/common/template/index"
fileを省略
render file: "/common/template/index"
render :text
説明
文字列を直接表示
使い方
render text: "文字列"
例
レイアウトを適用
render text: "文字例", layout: true
エラーメッセージの表示
render text: "文字例", status: 500
「hello world!」を表示
render text: "hello world!"
文字列とstatusコード500を返す
render text: "Explosion!", status: 500
レイアウトを使用して文字列を表示
render text: "Hi there!", layout: true
render :partial
説明
部分テンプレート
使い方
render partial: "部分テンプレート名"
例
_page.rhtmnlを使って表示
render partial: "page"
部分テンプレートを繰り返し表示
render partial: "user", collections: @users
部分テンプレートにローカル変数を渡す
render partial: "user", locals: { val1: xxx, val2: xxx }
render :inline
説明
アプリケーション外のテンプレートを表示
使い方
render inline: テンプレート文字列
例
現在の時刻を表示
render inline: "<%= Time.now %>"
render :xml
説明
指定されたテキストを表示し、コンテンツタイプをapplication/xmlに設定
使い方
render xml: モデル or 文字列
例
pagesテーブルの内容をXML形式で出力
@pages = Page.all
render xml: @pages
render :json
説明
指定されたテキストを表示し、コンテンツタイプをapplication/xmlに設定
使い方
render json: モデル or 文字列
例
pagesテーブルの内容をJSON形式で出力
@pages = Page.all
render json: @pages
例
404コード
render nothing: true, status: 404
render :plain
説明
平文テキストを表示
使い方
render plain: 文字列
例
OK
render plain: "OK
render :html
説明
平文テキストを表示
使い方
render html: 文字列
例
Not Found
render html: helpers.tag.strong('Not Found')
render :js
説明
JavaScriptを表示
使い方
render js: 文字列
例
JavaScriptを表示
render js: "alert('Hello Rails');"
render :body
説明
生のコンテンツを表示
使い方
render body: 文字列
例
JavaScriptを表示
render body: "raw"
その他
renderを複数使用
説明
renderを複数回呼び出すとエラーになるため、条件分岐した後「and return」で明示的に終了させる
使い方
render オプション and return
ソースコード
表示結果を文字列として取得
layout: page
説明
表示結果を文字列として取得
使い方
render_to_string(リクエスト)
例
userテンプレートを取得
render_to_string partial: "user"
ソースコード
URLを指定して表示
layout: page
説明
URLを指定して表示
使い方
redirect_to(リダイレクト先のパス [, status: ステイタスコード, オプション])
ステータスコード
シンボル | コード | 説明 |
---|---|---|
:ok | 200 | 成功 |
:created | 201 | リソースの生成に成功 |
:moved_permanently | 301 | リソースが永続的にリダイレクト |
:found | 302 | リソースが一時的にリダイレクト |
:see_other | 303 | リソースが別の場所にある |
:bad_request | 400 | 不正なリクエスト |
:unauthorized | 401 | 未承認 |
:forbidden | 403 | アクセス禁止 |
:not_found | 404 | リソースが存在しない |
:method_not_allowed | 405 | HTMLメソッドが許可されていない |
:internal_server_error | 500 | 内部サーバエラー |
オプション
オプション | 説明 |
---|---|
:alert | エラーメッセージを表示 |
:notice | 通知用のメッセージを表示 |
:flash | パラメータを使って、一時的に値を保存 |
例
指定したページにリダイレクト
redirect_to action: "show", id: 5
インスタンス変数
redirect_to @post
URL
redirect_to "http://www.rubyonrails.org"
相対パス
redirect_to "/images/screenshot.jpg"
ステータスコード指定
redirect_to post_url(@post), status: 301
エラ〜メッセージを表示
redirect_to post_url(@post), alert: "Watch it, mister!"
通知メッセージを表示
redirect_to post_url(@post), status: :found, notice: "Pay attention to the road"
flash指定
redirect_to post_url(@post), status: 301, flash: { updated_post_id: @post.id }
ソースコード
バイナリデータを出力
layout: page
説明
バイナリデータを出力
使い方
send_data(送るデータ [, オプション])
オプション
オプション | 説明 | デフォルト値 |
---|---|---|
:filename | 保存するときに使用するファイル名 | ファイル名 |
:type | コンテントタイプ | application/octet-stream |
:disposition | ファイルをインラインで表示するか、ダウンロードして保存するかブラウザに通知 | attachment |
:status | ステータスコード | 200(:ok) |
例
基本的な使い方
send_data buffer
動的に生成
send_data generate_tgz('dir'), filename: 'dir.tgz'
JPEGを表示
send_file '/path/to.jpeg', type: 'image/jpeg', disposition: 'inline'
404を表示
send_file '/path/to/404.html', type: 'text/html; charset=utf-8', status: 404
ソースコード
画像やファイルのダウンロード
layout: page
説明
指定したパスに存在する画像やファイルを読み込み、その内容をクライアントに送信
使い方
send_file(ファイルのパス [, オプション])
オプション
オプション | 説明 | デフォルト値 |
---|---|---|
:filename | ダウンロードするときに使用するファイル名を指定 | ファイル名 |
:type | コンテントタイプ | application/octet-stream |
:disposition | ファイルをインラインで表示するか、ダウンロードして保存するかブラウザに通知 | attachment |
:status | ステータスコード | 200(:ok) |
:url_based_filename | Content-Dispositionヘッダ内のファイルのベース名を使わなくする | false |
:length | 送信されようとしているコンテンツのサイズ | |
:stream | falseの場合、ファイル全体が読み込まれてから表示 | |
:buffer_size | ストリーミングがtrueの時に、1回に送信されるデータ量 | |
:x_sendfile | lighttpdやapacheで利用できるローカルファイル送信用モジュール |
例
指定されたzipファイルをダウンロード
send_file '/path/to.zip'
指定されたPDFをtest.pdfという名前でダウンロード
send_file '/path/test_pdf.pdf', filename: 'test.pdf'
ソースコード
リクエストを送ってきたユーザのヘッダー情報や環境変数を取得
layout: page
説明
リクエストを送ってきたユーザのヘッダー情報や環境変数を取得
使い方
request.メソッド
メソッド
メソッド名 | 説明 |
---|---|
GET | |
POST | |
accept_encoding | エンコーディング形式を取得 |
accept_language | 受信可能な言語 |
authority | authorityを取得 |
authorization | 認証情報を取得 |
base_url | URLを取得 |
body | ポストデータを取得 |
content_charset | charsetパラメータを取得 |
content_length | コンテンツサイズを取得 |
content_type | content-typeを取得 |
controller_class | |
controller_class_for | |
cookie_jar | |
cookies | クッキーを取得 |
delete? | HTTPメソッドがDELETEであるか? |
get? | HTTPメソッドがGETであるか? |
head? | HTTPメソッドがHEADであるか? |
host | ホスト名を取得 |
host_with_port | ホスト名とポート番号を取得 |
form_data? | フォームデータがあるか? |
fullpath | リクエストURLを取得 |
headers | リクエストヘッダーの情報取得 |
http_auth_salt | |
ip | IPアドレスを取得 |
link? | HTTPメソッドがLINKであるか? |
key? | 一致するヘッダーがあるか? |
local? | ローカル通信であるか |
logger | |
media_type | メディア対応の取得 |
media_type_params | |
method | HTTPメソッド |
method_symbol | メソッドをシンボルで取得 |
multithread? | |
new | |
original_fullpath | 最後に要求されたパスを取得 |
original_url | 元のリクエストURLを取得 |
options? | |
parseable_data? | |
patch? | HTTPメソッドがPATCHであるか? |
path | |
path_info | |
path_info= | |
port | ポート番号 |
post? | HTTPメソッドがPOSTであるか? |
put? | HTTPメソッドがPUTであるか? |
query_string | クエリ文字(?より後ろの部分) |
referer | |
query_parameters | |
raw_post | リクエスト本文を取得 |
remote_ip | クライアントのipアドレスを取得 |
request_id | X-Request-Idヘッダーを取得 |
request_method | リクエストメソッドを取得 |
request_method_symbol | リクエストメソッドをシンボルで取得 |
request_parameters | |
reset_session | |
scheme | |
script_name | |
script_name= | |
session | |
session_options | |
send_early_hints | |
server_software | 使用しているサーバソフトウェア |
session_options=(options) | |
ssl? | |
trace? | |
trusted_proxy? | |
unlink? | |
url | リクエストのURLを取得 |
user_agent | ユーザエージェントを取得 |
values_at | |
uuid | X-Request-Idヘッダーを取得 |
xhr? | 「X-Requested-With」ヘッダーに「XMLHttpRequest」が含まれているか? |
xml_http_request? | Ajaxによって実行されたものか |
例
リクエストメソッドの取得
request.request_method
リンク先のURLを取得
request.headers[:referer]
すべてのリクエストヘッダを取得
request.headers
ソースコード
応答ステータスとヘッダ情報のみを表示
layout: page
説明
応答ステータスとヘッダ情報のみを表示
使い方
head(ステータスコード [, 応答ヘッダ])
ステータスコード
シンボル | コード | 説明 |
---|---|---|
:ok | 200 | 成功 |
:created | 201 | リソースの生成に成功 |
:moved_permanently | 301 | リソースが永続的にリダイレクト |
:found | 302 | リソースが一時的にリダイレクト |
:see_other | 303 | リソースが別の場所にある |
:bad_request | 400 | 不正なリクエスト |
:unauthorized | 401 | 未承認 |
:forbidden | 403 | アクセス禁止 |
:not_found | 404 | リソースが存在しない |
:method_not_allowed | 405 | HTMLメソッドが許可されていない |
:internal_server_error | 500 | 内部サーバエラー |
例
応答ステータスとヘッダ情報のみを表示
head :created, location: person_path(@person)
ステータスコード200
head :ok
ステータスコード404
head :not_found
ソースコード
簡単なメッセージを画面に表示
layout: page
説明
簡単なメッセージを画面に表示
使い方
基本
flash[キー] = 値
現在のアクションのみ有効
flash.now[キー] = 値
有効期限を1リクエスト増やす
flash.keep(キー)
破棄
flash.discard(キー)
特徴
- 項目追加の成功の有無などユーザへ簡単なメッセージを表示する
- 「アクション->リダイレクト->アクション」の処理が済むと削除される
- ブラウザのクッキーを無効にしている場合は使用できない
例
コントローラ
flash[:notice] = メッセージ
ビュー
<%= h(flash[:notice]) %>
XML形式のデータをハッシュに変換
layout: page
説明
XML形式のデータをハッシュに変換
使い方
Hash.from_xml(XMLデータ)
例
XML形式のデータをハッシュに変換
Hash.from_xml("<langs><lang>Japanese</lang><lang>English</lang></langs>")
# {"langs"=>{"lang"=>["Japanese", "English"]}}
ソースコード
コントローラのパスを取得
layout: page
説明
コントローラのパスを取得
使い方
コントローラ名.controller_path
例
コントローラのパスを取得
MyApp::MyPostsController.controller_path
# "my_app/my_posts"
ソースコード
コントローラのクラス名を取得
layout: page
説明
コントローラのクラス名を取得
使い方
ActionController::Base.controller_name
例
コントローラのクラス名を取得
EntriesController.controller_name
# "entries"
ソースコード
Atomフィードを生成
layout: page
説明
Atomフィードを生成
使い方
atom_feed([オプション]) do |f|
end
オプション
オプション | 説明 | デフォルト値 |
---|---|---|
:language | 使用する言語 | en-US |
:root_url | フィードを置き換える文章のURL | / |
:url | フィードのURL | 現在のURL |
:id | フィードのid値 | |
:schema_date | スキーマ情報 | 今年 |
:instruct | XMLのハッシュ |
例
Atomフィードを生成
atom_feed do |f|
f.title('新着記事フィード')
f.updated(@pages.last.created_at)
@pages.each do |p|
feed.entry(p, url: p.url, published: p.published, updated: p.updated_at) do |i|
i.title(p,title)
i.content("#{@page.published} 公開")
end
end
end
日本語を指定
atom_feed(language: 'ja-JP') do |f|
f.title('新着記事フィード')
f.updated(@pages.last.created_at)
@pages.each do |p|
feed.entry(p, url: p.url, published: p.published, updated: p.updated_at) do |i|
i.title(p,title)
i.content("#{@page.published} 公開")
end
end
end
ソースコード
キャッシュのポリシーを設定
layout: page
説明
キャッシュのポリシーを設定
使い方
expires_in(有効期限 [, オプション])
オプション
オプション | 説明 |
---|---|
:no-cache | キャッシュを無効化 |
:no-store | 返されたデータをキャッシュに記録しない |
:max-age | キャッシュの有効性の再確認をせずに、データに保持できる最大期間 |
:max-stale | 有効期限の切れたデータを許可する |
:min-fresh | 最新のデータを取得する |
:no-transform | メディアタイプを変更しない |
:only-if-cached | キャッシュからデータを取得 |
:cache-extension | トークンを使って拡張 |
:public | キャッシュされたデータを複数ユーザで共有 |
:private | キャッシュされたデータを共有しない |
:must-revalidate | キャッシュの有効期間を必ず問い合わせる |
:proxy-revalidate | プロキシサーバにキャッシュの有効性を確認 |
:s-maxage | 基本的な機能は、max-ageと同じ。ただし、こちらは共有キャッシュにだけ適用される |
例
キャッシュの有効期限を20分
expires_in 20.minutes
キャッシュを共有
expires_in 20.minutes, public: true
ソースコード
キャッシュの無効化
layout: page
説明
キャッシュの無効化
使い方
expires_now
例
キャッシュの無効化
expires_now
ソースコード
ログを出力
layout: page
説明
ログファイルなどに出力
使い方
logger.ログレベル(値)
ログレベル
ログレベル | 説明 |
---|---|
unknown(値) | 不明なエラー |
fatal(値) | 致命的なエラー |
error(値) | エラー |
warn(値) | 警告 |
info(値) | 通知 |
debug(値) | デバック情報 |
例
致命的なエラー
logger.fatal('致命的なエラーです')
デフォルトのURLにマッピング
layout: page
説明
デフォルトのURLにマッピング
使い方
url_options
例
url_options
ソースコード
フラッシュメッセージのタイプを指定
layout: page
説明
フラッシュメッセージのタイプを指定
フラッシュメッセージとは、エラー時などにページ上部に表示されるメッセージ
使い方
add_flash_types(:タイプ名 [, ...])
例
フラッシュメッセージのタイプを指定
add_flash_types :warning
複数指定
add_flash_types :success, :info, :warning, :danger
ソースコード
直前のページにリダイレクト
layout: page
説明
直前のページにリダイレクト
使い方
redirect_back(HTTP_REFERERが設定されていない場合のリダイレクト先 [, オプション])
オプション
オプション | 説明 | デフォルト値 |
---|---|---|
:allow_other_host | 異なるホストへのリダイレクトを許可するか | true |
例
直前のページにリダイレクト
redirect_back fallback_location: { action: "show", id: 5 }
インスタンス変数
redirect_back fallback_location: @post
URL
redirect_back fallback_location: "http://www.rubyonrails.org"
相対パス
redirect_back fallback_location: "/images/screenshot.jpg"
異なるホストへのリダイレクト
redirect_back fallback_location: '/', allow_other_host: false
補足
- Rails5.1以前は「redirect_to :back」
ソースコード
リクエストで指定されたフォーマットに合わせて出力
layout: page
説明
リクエストで指定されたフォーマットに合わせて出力
使い方
respond_to do |format|
format.Mimeタイプ
end
例
respond_to do |format|
format.html
format.js
format.xml { render xml: @people }
end
redirect_to(person_list_url)
ソースコード
Basic認証
layout: page
説明
Basic認証
使い方
http_basic_authenticate_with(name: 名前, password: パスワード [, realm: 認証が必要がエリア名, オプション])
例
Basic認証
http_basic_authenticate_with name: ENV['BASIC_AUTH_USERNAME'], password: ENV['BASIC_AUTH_PASSWORD'] if Rails.env == 'staging'
ソースコード
CSRF対策の設定
layout: page
説明
CSRF対策の設定
使い方
protect_from_forgery([オプション])
オプション
オプション | 説明 |
:only | 実行するアクション |
:except | 実行しないアクション |
:if | 実行する条件を指定 |
:unless | 実行されない条件を指定 |
:prepend | |
:with |
例
CSRF対策の設定
protect_from_forgery except: :index
CSRF対策の設定
protect_from_forgery with: :exception