古いバージョンのドキュメントです。最新のバージョンはRails7.0.0

Railsドキュメント(v6.0.2.1)

コントローラについて

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

ソースコード