記事概要
Ruby on Railsのコントローラーについて、まとめる
前提
- Ruby on Railsでアプリケーションを作成している
基本情報
ファイルパス
app/controllers/[コントローラー名]_controller.rb
記載方法
ルーティングで設定したアクション名のインスタンスメソッドを定義する
class PostsController < ApplicationController
def アクション名
# 処理を記述
end
end
インスタンス変数
インスタンス変数は、ビューファイルで使用できる
モデルの処理
データ取得のみなど、簡単なモデルの処理はコントローラーに記述できる
パラメーター
リクエストに含まれて、サーバーの外部から渡されるデータのこと
params
送られてきたパラメーターをハッシュのような構造で格納したもの
params[:キー名]
で値を取り出せる
ストロングパラメーター
意図しないデータベースの読み書きを防ぐために使用する
プライベートメソッドとして、require
メソッドとpermit
メソッドを組み合わせることで、定義できる
まとめ(データ編集)
newメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
save
メソッドと合わせて使用することで、データの新規作成とテーブル保存ができる
saveメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
# postsテーブル(Postモデル)のcontentカラムに、パラメーターから受け取ったcontentに格納された情報を格納する
# 上記を変数postに格納する
post = Post.new(content: params[:content])
# 変数postを保存する
post.save
createメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
受け取ったパラメータの情報を保存する
# postsテーブル(Postモデル)のcontentカラムに、パラメーターから受け取ったcontentに格納された情報を保存する
Post.create(content: params[:content])
updateメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
def update
# findメソッドで編集対象を指定
item = Item.find(params[:id])
# item_paramsの情報で、レコードを編集
item.update(item_params)
# ルートパスへ移動
redirect_to root_path
end
private
def item_params
params.require(:item).permit(:name, :price)
end
destroyメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
削除対象を指定する場合はparams[:id]
を使用し、削除するレコードを取得する
def destroy
# findメソッドで削除対象を指定
tweet = Tweet.find(params[:id])
# レコードを削除
tweet.destroy
# ルートパスへ移動
redirect_to root_path
end
まとめ(データ取得)
findメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
allメソッド
詳細は、こちらを参照
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
includesメソッド
引数に指定された関連モデルを1度のアクセスでまとめて取得するメソッド
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
# includesメソッドを使用するとすべてのレコードを取得するため、allメソッドは省略可能
モデル名.includes(:紐付くモデル名)
@tweets = Tweet.includes(:user)
orderメソッド
テーブルから取得してきた複数のレコード情報を持つインスタンスの、並び順を変更するメソッド
事前定義されているため、開発時にモデルファイルで定義しなくてもコントローラーファイルに記述することが可能
インスタンス = モデル名.order("並び替えの基準となるカラム名 並び順")
# tweetsテーブルのレコードを、作成日が新しいものから順に取得する
@tweets = Tweet.includes(:user).order("created_at DESC")
並び順 | 内容 |
---|---|
ASC(昇順) | 小さいものから大きいものになる。古いものから新しいのものになる |
DESC(降順) | 大きいものから小さいものになる。新しいものから古いものになる |
アソシエーション
レコードに紐づいている別モデルのデータを取得
# Tweetモデルのデータを取得し、変数tweetに格納
1] pry(main)> tweet = Tweet.find(3)
Tweet Load (0.4ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 3 LIMIT 1
=> #<Tweet:0x0000000109137e00
id: 3,
text: "葉桜になってる",
image: "hasakura.jpeg",
created_at: Wed, 30 Apr 2025 16:38:13.788717000 UTC +00:00,
updated_at: Wed, 30 Apr 2025 16:38:13.788717000 UTC +00:00,
user_id: 1>
# 変数tweetに格納されているuser_idを元に、Userモデルのレコード情報を取得
[2] pry(main)> tweet.user
User Load (1.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User id: 1, email: "taro@email.com", created_at: "2025-04-30 16:37:03.919419000 +0000", updated_at: "2025-04-30 16:37:03.919419000 +0000", nickname: "太郎">
# tweet.userのレコード情報のうち、nicknameカラムの値のみを取得
[3] pry(main)> tweet.user.nickname
=> "太郎"
whereメソッド
詳細は、こちらを参照
def search
# モデルで設定したsearchメソッドの引数に、params[:keyword]と記述
@tweets = Tweet.search(params[:keyword])
end
まとめ(パラメーター)
requireメソッド
送信されたパラメーターの情報を持つparams
が使用できるメソッド
パラメーターから、どの情報を取得するかを選択する
params[:モデルのファイル名]
と記述しても同じ情報を取得できるが、require
メソッドを使うことで、意図しないパラメーターであった場合にエラーとして返すことができ、原因特定やユーザーにエラーを示すなどの対応ができる
# 取得したい情報を指定する
params.require(:モデルのファイル名)
permitメソッド
送信されたパラメーターの情報を持つparams
が使用できるメソッド
パラメーターから取得したいキーを指定し、指定したキーと値のセットのみを取得する
キーを指定すると、それ以外のキーがあっても値を受け付けない
# 取得したいキーを指定する
params.require(:モデルのファイル名).permit(:キー名, :キー名)
mergeメソッド
詳細は、こちらを参照
class TweetsController < ApplicationController
def new
@tweet = Tweet.new
end
def create
Tweet.create(tweet_params)
redirect_to '/'
end
private
def tweet_params
# paramsとcurrent_userのIDを結合
params.require(:tweet).permit(:text, :image).merge(user_id: current_user.id)
end
end
ルーティングのネスト
詳細は、こちらを参照
def comment_params
params.require(:comment).permit(:text).merge(user_id: current_user.id, tweet_id: params[:tweet_id])
end
まとめ(その他)
redirect_toメソッド
Railsでリダイレクト処理を行う際に使用するメソッド
処理終了後、アクションに対応するビューファイルを参照せずに、別ページへリダイレクトする
URLを直接指定する
redirect_to "URIパターン"
アクションを指定する
redirect_to action: :アクション名
before_actionメソッド
コントローラで定義されたアクションが実行される前に、共通の処理を行うことができる
class コントローラー名 < ApplicationController
before_action :共通処理のメソッド名
# 省略
private
def 共通処理のメソッド名
# 共通処理
end
end
onlyオプション
指定したアクションの実行前にのみ、共通処理を行う
class コントローラー名 < ApplicationController
before_action :共通処理のメソッド名, only: [:アクション名, :アクション名]
# 省略
private
def 共通処理のメソッド名
# 共通処理
end
end
ifオプション
値にメソッド名を指定し、戻り値がtrue
の場合のみ、共通処理行う
class コントローラー名 < ApplicationController
before_action :共通処理のメソッド名, if: :メソッド名?
# 省略
private
def 共通処理のメソッド名
# 共通処理
end
end
exceptオプション
指定したアクションに対しては、共通処理を行わない
class コントローラー名 < ApplicationController
before_action :共通処理のメソッド名, except: [:アクション名, :アクション名]
# 省略
private
def 共通処理のメソッド名
# 共通処理
end
end
Ruby on Railsまとめ
コントローラー