20201009_アウトプット(ライブラリ・例外処理)

アプトプット画像

学んだこと

Rubyに用意された機能を呼び出す方法

  • あらかじめ用意された機能のカタマリを「ライブラリ」という。
標準ライブラリ 組み込みライブラリ 外部ライブラリ(gem)
Rubyに標準で用意 標準ライブラリの中でも特に利用頻度が高いもの 世界中の有志の
エンジニアによって提供
インストール不要 インストール不要 別途インストールが必要
date,fileutils,
csv,json,yaml
String ,Integer,
Array,Hash等
bundler,rails,rspec,
nokogiri,faker等
(記述)require 'ライブラリ名' (記述)require 'ライブラリ名' (ターミナル)「gem install gemの名前」後、
(記述)require 'ライブラリ名'



例外処理

  • 例外とは、プログラムで起こる予期しない問題のこと(つまり、エラー)

  • 例外が発生すると、それ以降の処理は中止されて実行されなくなる。

  • 例外処理とは、あらかじめ「例外」を予期しておき、その時に行う処理を定義すること。

  • RubyおよびRuby on Railsでは、「Exception」というクラスを継承することで、様々な例外が定義されている。(NoMethodError,SyntaxError等)

初期のダミーデータを作成する方法(seed)

  • テーブル作成後(rails db:migrate後)、そのカラムに対し、ダミーデータを作成するには、「seed」が便利!
(1)ターミナルで、以下のコマンドを実行すると、ダミーレコードを作るためのファイルが生成される。
% rails db:seed
(2)(1)のコマンド実行後に、どのようなダミーデータを作りたいかファイル内を編集する。
【db>seeds.rbの今回の記載内容】
users = []
10000.times do |i|
 # usersに10000件新規ユーザーの情報を格納する
  users << User.new(name: "dummy-#{i+1}", ticket_count: 0)
end
# importメソッドの引数に配列を渡して、まとめてレコードを作成する
User.import users
# 例外を仕込む
User.find(500).update(ticket_count: 2147483647)
  • 今回はこのファイルのために「activerecord-import」というGemを利用。

  • このGemおかげで、モデルが「importメソッド」を使用できる様になる。

  • 「importメソッド」とは、配列に大量の情報を格納して、その配列から情報を取りに行くことによって、1回のアクセスで大量のレコード作成ができるメソッド。



Rakeタスク

  • タスクを簡単に実行できるRubyのツール。

  • 利用することで、アプリケーションのタスクをコマンドで実行できる。

  • 今回定義する内容は「通常は一人10枚ずつチケットを配る」が、例外が発生した時に「10枚ずつチケットを配りつつ、例外が起きた人だけ別の処理を行う」場合と、「例外が発生したら全員に対して10枚配るのをやめる(その処理ごとなかったことにする)」場合について定義したい。

  • それぞれを定義し、実行されるか処理したい場合に、Rakeタスクが使える。(処理に際して、ダミーデータが必要なため、先ほどのseedが活きる)

(1)コマンドで、Rakeファイルを作成する
rails g task タスクファイル名

(2)作成されたファイルに処理を記述する

namespace :distribute_ticket do
  desc "全ユーザーのticket_countをrescueしながら10増加させる"
  task rescue: :environment do
    User.find_each do |user|
      begin
        user.increment!(:ticket_count, 10)
      rescue => e
        Rails.logger.debug e.message
      end
    end
  end

  desc "全ユーザーの中にticket_countが最大値のものを含んでいれば例外を発生させる"
  task raise: :environment do
    User.find_each do |user|
      begin
        if user.ticket_count > 2147483637
          raise RangeError, "#{user.id}は、チケット取得可能枚数の上限を超えてしまいます!"
   # raise 発生させたい例外クラス, 'エラーメッセージ'
        end
      rescue => e
        Rails.logger.debug e.message
      end
    end
  end

  desc "全ユーザーのticket_countをトランザクションで10増加させる"
  task transact: :environment do
    ActiveRecord::Base.transaction do
      User.find_each do |user|
        user.increment!(:ticket_count, 10)
      end
    end
  end
end
メソッド名 役割
namespace do ~ end 複数のタスクをグループ分けして1つにまとめる
desc 処理の説明。「description(説明)」の略。
task do ~ end タスクの内容
(3)タスクの実行
rails namespaceの名前:taskの名前

例外処理にあたって使うもの

  • 【begin】例外となりそうな箇所を囲い実行できる文法。

  • 【rescue】発生した例外を捕捉し、例外が起こった際に呼び出される条件節。処理を続けてはいけない例外でも処理してしまったり、意味のない例外処理を作る恐れがあるので、安易に使用しない。

  • 【raise】例外を発生させることができる文法。

  • トランザクション】一連の処理を一つにまとめて、処理が全て成功か、全て失敗かの状態を作ること。



積み残し(復習したいところ)

  • devise rollback方法

  • カラム追加の方法

  • Rails勉強会



感想

  • 10月8日から始めた「基本は朝やって、夜はのんびりする(自分のリフレッシュ)にする方針」について、かなり自分にあっている。

  • 理由は、睡眠の質がよくなったことと、今までは、残業してても、夜ご飯食べていても「勉強しなきゃ」という義務感にかられて焦っていた。「もう今日はやったから休もう」と気持ちを切り替えることによって、心がリフレッシュできて、プログラミングを楽しめるようになったこと。(最初の頃の気持ちを忘れかけていた気がする。)

  • あと、だんだんブログに書くことにも慣れてきた(マークダウン記法)。表など作るの早くなった(笑)アウトプットが目的だけど、もう少しコードとかは読みやすくしたいな。キータで見やすい人とかどのようにしているんだろう。(今回ググっていろいろ実験するもうまくいかず。また時間がある時に調べよう。)

  • プログラミングとは関係ないけれど、仕事で相手の進捗管理をすることは、コミニケーションにおいて大事だなと今日感じた。特に、うまく行っていなさそうな時、心がおれそうな時、詰まっていそうな時に、進捗を聞いて、自分が5分以内でできそうな部分はアドバイスしたり、話を聞いたりすると、相手の解決への糸口や、モチベーションに繋がっている気がした。(そのことを今日職場の4人にしたら、悩みを抱えていそうな顔が晴れやかになっていたことと、「ありがとう」と言ってもらえて自分自身も嬉しかったため。)