Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Rails】 nil落ちの回避方法

nil落ちの回避方法

findなどを使用した時に、レコードが存在しない場合NoMethodErrorが発生する。
そんな時に検索結果をnilで返したい時に行う方法を色々。

||=を使う

修正前
Useridが存在しない場合NoMethodErrorが発生する。

@current_user = User.find(params[:id])

修正後
Useridが存在しない場合@current_usernilを返す。

@current_user ||= User.find(params[:id])

&.を使う(ぼっち演算子)

レシーバーが nil のとき,NoMethodErrorを投げずにnilを返してくれる機能。

@current_user = User&.find(params[:id])

メソッドやスコープにも使えるので、便利

user.rb
class User < ApplicationRecord
  scope :find_user, -> { find(10) }
end

users_controller.rb
def show
   @current_user = User&.find_user
end

tryを使う

レシーバーが nil のとき、NoMethodErrorを投げずにnilを返してくれる機能。
※定義されていないものを呼び出そうとした時、#try はnilを返すため注意が必要

user.rb
class User < ApplicationRecord
  scope :find_user, -> { find(10) }
end

users_controller.rb
def show
   @current_user = User.try(find_user)
end

まとめ

  • ||=&.を使う事で簡単にNoMethodErrorを回避できる。

参考資料

第8章 コラム8.1
https://railstutorial.jp/chapters/log_in_log_out?version=4.2

tetusan
joyworks
Webアプリケーション開発・制作やBtoCのWebサイト開発をはじめ、幅広い開発プロジェクトを手がけている当社。近年は帰社しやすい環境づくりのために渋谷にオフィスを移転したり、当社専属のIT講師を採用し、AI研修などに力を入れています。
https://www.joyworks.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away