0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】[コントローラー名]_controller.rbについて

Last updated at Posted at 2025-04-07

記事概要

Ruby on Railsのコントローラーについて、まとめる

前提

  • Ruby on Railsでアプリケーションを作成している

基本情報

ファイルパス

app/controllers/[コントローラー名]_controller.rb

記載方法

ルーティングで設定したアクション名のインスタンスメソッドを定義する

[コントローラー名]_controller.rb
class PostsController < ApplicationController
  def アクション名
    # 処理を記述
  end
end

インスタンス変数

インスタンス変数は、ビューファイルで使用できる

モデルの処理

データ取得のみなど、簡単なモデルの処理はコントローラーに記述できる

パラメーター

リクエストに含まれて、サーバーの外部から渡されるデータのこと

params

送られてきたパラメーターをハッシュのような構造で格納したもの
params[:キー名]で値を取り出せる

Image from Gyazo

ストロングパラメーター

意図しないデータベースの読み書きを防ぐために使用する
プライベートメソッドとして、requireメソッドとpermitメソッドを組み合わせることで、定義できる

Image from Gyazo

まとめ(データ編集)

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]を使用し、削除するレコードを取得する
Image from Gyazo

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)

Image from Gyazo
Image from Gyazo

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メソッドを使うことで、意図しないパラメーターであった場合にエラーとして返すことができ、原因特定やユーザーにエラーを示すなどの対応ができる

Image from Gyazo
Image from Gyazo

# 取得したい情報を指定する
params.require(:モデルのファイル名)

permitメソッド

送信されたパラメーターの情報を持つparamsが使用できるメソッド
パラメーターから取得したいキーを指定し、指定したキーと値のセットのみを取得する

キーを指定すると、それ以外のキーがあっても値を受け付けない

Image from Gyazo

# 取得したいキーを指定する
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

Image from Gyazo

ルーティングのネスト

詳細は、こちらを参照

def comment_params
  params.require(:comment).permit(:text).merge(user_id: current_user.id, tweet_id: params[:tweet_id])
end

Image from Gyazo

まとめ(その他)

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まとめ

コントローラー

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?