0
0

More than 1 year has passed since last update.

begin rescue 文

Last updated at Posted at 2022-06-06

find

与えられたどのオプションにもマッチする「主キー」に対応するオブジェクトを取り出せます。

irb> customer = Customer.find(10)

カラム名をつけなくていい。

find_by

与えられた条件にマッチするレコードのうち最初のレコードだけを返します。

irb> Customer.find_by first_name: 'Lifo'
=> #<Customer id: 1, first_name: "Lifo">

irb> Customer.find_by first_name: 'Jon'
=> nil

カラム名をつける

irb(main):001:0> user = User.all
  TRANSACTION (0.1ms)  BEGIN
  User Load (0.4ms)  SELECT `users`.* FROM `users`
=>
[#<User:0x0000000112c78108
...

irb(main):002:0> post = Post.all
  Post Load (0.9ms)  SELECT `posts`.* FROM `posts`
=>
[#<Post:0x00000001129215e0
...

irb(main):003:0> post = Post.first
  Post Load (0.5ms)  SELECT `posts`.* FROM `posts` ORDER BY `posts`.`id` ASC LIMIT 1
=>
#<Post:0x00000001128806e0
...

irb(main):004:0> post.id
=> 3

irb(main):005:0> post = Post.find(id: 3)
  Post Load (0.3ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = NULL LIMIT 1
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/finder_methods.rb:381:in `raise_record_not_found_exception!': Couldn't find Post with 'id'={:id=>3} (ActiveRecord::RecordNotFound)

irb(main):006:0> post = Post.find(id: "3")
  Post Load (0.4ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = NULL LIMIT 1
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/finder_methods.rb:381:in `raise_record_not_found_exception!': Couldn't find Post with 'id'={:id=>"3"} (ActiveRecord::RecordNotFound)

irb(main):007:0> post = Post.find_by(id: 3)
  Post Load (0.6ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 3 LIMIT 1
=>
#<Post:0x000000011289a270
...

irb(main):008:0> post = Post.find_by(3)
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/query_methods.rb:1298:in `build_where_clause': Unsupported argument type: 3 (Integer) (ArgumentError)

irb(main):009:0> post = Post.find_by("3")
  Post Load (0.7ms)  SELECT `posts`.* FROM `posts` WHERE (3) LIMIT 1
=>
#<Post:0x0000000112a920f0
...

思ったこと

愚かだな。
まだ勉強しよう。

おかしな要求の場合に行う処理を実行する

例外

プログラム実行中に発生した例外的な問題のこと。
・エラーが起きてプログラムの実行を続けることができなくなった状態。
これをしておかないと
プログラムが続行できない異常事態が起こることを意図的に実行できる。

NoMethodError in Posts#show

Showing /Users/*************/Repos/garden/app/views/posts/show.html.erb where line #12 raised:
undefined method `errors' for nil:NilClass
 Couldn't find Post with 'id'={:id=>"3"} (ActiveRecord::RecordNotFound)
'.freeze;     @post.errors.full_messages.each do |message| 
                   ^^^^^^^

@postがnilなのにも関わらずメソッドを呼ぼうとしていることにエラーが発生する。

Showing /Users/*************/Repos/garden/app/views/posts/show.html.erb where line #12 raised:

上が例外発生するまでの過程を表している。(下から上に並べている)
これをバックトレース、スタックトレース(11章に続きがある。)と呼ぶ。
12行目が例外が発生している。

rubyコマンドを実行した場合は例外が発生した時点で終了
(それ以降の処理は行われない。)

出典 プロを目指すRuby入門

例外を補足して処理を続行する場合

プログラムに例外処理を明示的に書くことでプログラムを続行させます。

begin
  # 例外が起きうる処理
rescue
  # 例外が発生した場合の処理
end

例外起きやすいコードを書いておく

posts_controller.rb
  def show
    begin
      @post = Post.find(params[:id])
    rescue
      @error_message = "例外です。"
      redirect_to "/"
    end
  end
0
0
2

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