こんにちは、エンジニアのさもです。
先日、あるツイートに返信しました。何人かの方がいいねしてくださったので、少しだけ僕の思いを「ゆとり世代を批判する世代(40代50代60代)への反論」という形でもう少し詳しく書きたいと思います。
続きを読むゆとり教育自体35年くらい前に始まったことだから、今の40代の人はすでにゆとり世代なんだよなぁ
— ミナックス_パパ (@uosan_satox13) 2017年12月5日
こんにちは、エンジニアのさもです。
先日、あるツイートに返信しました。何人かの方がいいねしてくださったので、少しだけ僕の思いを「ゆとり世代を批判する世代(40代50代60代)への反論」という形でもう少し詳しく書きたいと思います。
続きを読むゆとり教育自体35年くらい前に始まったことだから、今の40代の人はすでにゆとり世代なんだよなぁ
— ミナックス_パパ (@uosan_satox13) 2017年12月5日
こんにちは、エンジニアのさもです。
普段Rubyを使っている方や、Rubyを使い始めた方もuser_list[0..3]
のように配列に対して範囲を指定できることはご存知かと思います。
一方、user_list[0...3]
のように3つドットを使うとindexが0から2(3は含まない)の範囲の要素をとってくることができます。
これ、いつ使うねんとずっと思っていたのですが、使うと記述が簡単になる場面に遭遇したので紹介します。
続きを読む
こんにちは、エンジニアのさもです。(↑サンタ服をきた長男1歳半です。美白)
実は、今妻が妊娠5か月です。いわゆる安定期に突入した時期です。
予定日は2018年の春です。妻の出産した日から(夫である私が)育休を取るの予定なのですが、なぜ育休を取ることに決めたのかを書いてみたいと思います。
また、育休について知らない方の為に、ざっくりと育休という制度についてご説明します。
(注)ざっくりなので、あらゆるパターンの取得方法は説明しません。あくまで基本的な私が取得を考えているパターンです。
続きを読むこんにちは、エンジニアのさもです。
仕事で次のような要件のメソッドを実装しました。
(具体例)
今回は、実装したメソッドの紹介と、Minitestでのテストコードを紹介します。
テスト駆動ではなかったので、後で完成したテストコードを載せています。
続きを読む
こんにちは、エンジニアのさもです。
2回目にしていきなり例外処理です。しかもQAじゃないです(笑)
入門したては、ガンガン機能を追加していき、サイトを作りこんで行きたいかと思うのですが、少し立ち止まって、例外処理について学んで下さい。
一度書くと、次に作るときにコピペでOKです!
スポンサーリンク
目次
Javaなどのプログラミング言語でも例外を投げる、キャッチする。なんて言いますよね。
Rubyにもraise, rescueという例外に関する仕様はあるのですが、今回はRailsで例外発生時の挙動をどうするか、について書いていきます。
webサイトを良く見る方は、「404 Not Found」みたいなページを見たことがあるでしょうか?URLが間違っていたり、久しぶりに訪れたらサイトが無くなっていたなんてときに表示されるページです。
「404」というのはwebページへアクセスしたときに、コンテンツと一緒についてくる、「HTTPステータスコード」の一つです。
正常にページが見れるときは、200が割り当てられています。サーバに障害があったときは、500が返ってきたりします。
詳しくはこちら
404はただのコードなので、webページの場合は、返ってきてもどうしようもないですよね。だから404ページと言われるものを返します。
自分でwebサイトを作るときも、間違ったURLにアクセスされたとき用に404ページは作っておかなければなりません。
それ以外に、例えば、/users/1 のように、idが1のユーザにアクセスするURLがあるとします。このとき、存在しないユーザーIDへアクセス(/users/999)した場合にも404ページを返さなくてはいけません。
なぜなら、RailsはRestful、つまりURLとリソースが1対1で結びついているからです。リソースというと、/views/users/show.html.erb
のことを思い浮かべるかもしれませんが、実際は、「idが1のユーザー」の事を指しています。htmlファイルはあくまでも、リソースを見やすく整形したものです。
そのため、「/users/存在しないユーザーID」にアクセスされたときは、対応するリソース(ユーザー)が存在しないので、ページが存在しないという情報を返さなくてはなりません。この情報が、404ページであり、ステータスコード404です。
例外処理の基本は、例外が発生(raise)ー>例外をキャッチ(rescue)です。
まずは例外の発生について書いていきましょう。
具体的にどのように実装するのか、ですが、実はとても簡単です。
最も基本的な例ですが、UsersController#show
で、存在しないユーザIDが指定された場合について考えましょう。
class UsersController < ApplicationController before_action :set_user, only: [:edit, :update, :show, :destroy] # index等省略 def show end private def set_user @user = User.find(params[:id]) end end
はい、完了です。
いつもどおりのコントローラですね。
どこで例外が発生するかわかりますか?
正解は、find
メソッドです。
find
メソッドは、引数で渡したIDのユーザが存在しない場合に、ActiveRecord::RecordNotFound
という名前の例外を発生させます。
試しに、rails consoleで「User.find(999)」と打ってみてください(モデルはお使いの環境に合わせて、存在しているモデルに変えてください)。ActiveRecord::RecordNotFound
と表示されるはずです。
何もしません(笑)
404エラーや500, 422エラーの場合は、Railsがよしなにやってくれます。
表示されるエラーページ自体はpublicフォルダにあります。
ただし、デフォルトのエラーページは味気ないので、かっこよくカスタマイズしたい場合は、public/404.htmlなど、対応するhtmlファイルを編集すればOKです。
ActiveRecord::RecordNotFound
の場合には自動的に例外を投げてくれましたが、「自分のサイトではこういう場合に404を発生させて、404ページを表示したいんだ」ということがあります。
そんなときは以下のようにします。(例えば、ユーザのemailカラムが未入力の場合に、まだユーザが存在していないかのように見せたいとき。)
class UsersController < ApplicationController before_action :set_user, only: [:edit, :update, :show, :destroy] # index等省略 def show raise ActiveRecord::RecordNotFound.new("お試し例外だよ") if @user.email.nil? end private def set_user @user = User.find(params[:id]) end end
show
アクションに1行追加しました。
raise
メソッドは、第一引数の例外を発生させるKernelクラスのメソッドです。
ちなみに、raise
メソッドに文字列を渡すと、その文字列をメッセージとしたRuntimeError
例外を発生させます。
ActiveRecord::RecordNotFound
をはじめ、例外はたくさんあります。そこで、用意している例外以外の例外に対応するために、
復旧可能な実行時エラーの親クラスである、StandardError
に対してrescue
します。
エラーキャッチの定義は、application_controller.rbに書きます。
class ApplicationController < ActionController::Base rescue_from StandardError, with: :rescue_exeption def rescue_exeption(e = nil) if e logger.info "StandardError!: #{e.message}" logger.info e.backtrace.join("\n") end redirect_to root_path end end
このように書いておくと、Railsが拾わなかった例外を、rescue_exeption
メソッドが処理してくれるようになります。rescue_exeption
内では、エラー原因特定やデバッグのために、出来るだけ多くの情報を残しましょう。
Bagsnagというサービスを利用して、開発者へ通知するなどの処理を含めるのも有効です。
より詳しく勉強したいという方のために、オススメの書籍を紹介します
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
Ruby on Rails 5アプリケーションプログラミング
Ruby on Rails 4 アプリケーションプログラミング
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
以上、Railsの例外処理でした。
いかなるユーザの操作に対しても応答できるwebサービスを目指して、ぜひ例外処理を書いてみてください。
読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。
こんにちは、エンジニアのさもです。
2017年11月30日までAmazonで人工知能関連書籍が50%(以上)OFFになっています。
あと4日!!
ゲームを作りながら楽しく学べるPythonプログラミング (Future Coders(NextPublishing))
詳解 ディープラーニング TensorFlow・Kerasによる時系列データ処理(20%OFF)
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
TensorFlow機械学習クックブック(50%OFF)
TensorFlow機械学習クックブック Pythonベースの活用レシピ60+ impress top gearシリーズ
世界標準MIT教科書 Python言語によるプログラミングイントロダクション(50%OFF)
世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第2版:データサイエンスとアプリケーション
などなど対象商品は111件ありました。
こんちには、エンジニアのさもです。
またセールやってないかなとAmazonのKindleストアをみると、雑誌99円セールというものをやっていました。
あんまり雑誌に興味がないなと思いつつも、みてみると、結構種類が豊富で、中には96%OFFの雑誌もあったので早速買っちゃいました(笑)
ちょっとだけ紹介します。
楽しいガジェットを作る いちばんかんたんなラズベリーパイの本
驚異の96%OFF!買いました。
FRIDAY (フライデー) 2017年11月17日号 [雑誌] FRIDAY
普段絶対に買いませんが、99円なら・・・
一生使えるオレンジページVOL.4 収納&捨てワザで家じゅうすっきり! (オレンジページブックス)
などなど、今のところ、対象商品は3,712 点ありました。