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人にしたら、悩みを抱えていそうな顔が晴れやかになっていたことと、「ありがとう」と言ってもらえて自分自身も嬉しかったため。)