『Ruby on Rails5 アプリケーションプログラミング』学習日誌 4

前書き

今日も第5章モデルについて学習していきたいと思います。 ソースコードにもコメントで気づいたことについて注釈入れてます。

ページ範囲

p.229-267

before_action メソッド, only: アクション

コントローラで上記のように書くとアクションに先立ってメソッドを実行するという意味になる。この場合のメソッドをフィルターと呼ぶ。そしてこのメソッドも同じコントローラ内で定義するが、この場合は意図せず呼び出されるのを防ぐためにprivateメソッドにするのが普通である。

ルート定義(基礎編復習)

ルートはurlパターンとhttpメソッドとそれを呼び出すコントローラーのアクションを指定する必要があるが、(アクションメソッドがない場合は直接viewを返す)フィルターの場合はそれの親のメソッドがルートに影響する。

トランザクション処理とは?

いくつかの処理をひとまとめにして処理が全部成功しなかった場合はをロールバックしてはじめの状態に戻し全ての処理をなかったことにするメソッドのこと。transactionメソッド。トランザクションが確定することをcommitと呼ぶ。

例外処理について

raiseによって意図的に例外を発生させることができる。raiseメソッドには引数としてエラーメッセージを渡すことができる。また例外が発生したときはrescueメソッドを用意しておくとrescue節までジャンプし、その時点から処理を続行することができる。rescue => e で変数eに例外自体をオブジェクトとして格納することができる。この場合の => は少し特殊な書き方に見える。rescueのメソッドなのかな?eはインスタンスメソッドとしてmessageやbacktraceなどのメソッドを持っている。この場合のmessageでは対象の例外であるraiseで引数として渡したメッセージが返ってくる。

form_withについて

qiita.com


ここにあるようにform_tagとform_forはrails5.1で非推奨となっているようです。scaffoldで部分テンプレートを(_form.html.erb)生成したときform_withで書かれていて、バージョン5.0.1を前提としている本書のサンプルコードでうまく動かなくて軽くはまりました。ここで ”利用バージョンは本書検証バージョンに揃えることを強くおすすめします。” を無視したことを思い出した。自分が悪いが、form_withは前の二つに比べて賢くて便利そうでよかった。 ** 検証機能
Active Model にはValidation機能がある(ActiveModel::Validations::〇〇Validatorクラス)。モデルクラスに検証のルールを設けて、不正なデータをDBに入る前にはじくことができる。validatesメソッドでデータ型やlength、正規表現などを指定してデータの形を限定することができる。

非DB系のモデル

ActiveModel::Modelモジュールを利用することでDBと関係を持たないモデルを作ることができる。例えばdbに関係ない検証などと関連づけて使用できる。モデルクラスを定義するときはActiveModel::Modelをincludeして必要な項目をアクセサメソッドで定義する必要がある。

感想

例外処理を学習している時にrubyは例外自体をオブジェクトとして扱っているということを知った。なおかつそいつが例外についての情報を持っていて、聞くと教えてくれるなんてなんか良い。rubyでは全てがオブジェクトらしいので当然なのかもしれないけどやっぱり面白いと思った。あと、saveやsave!が戻り値を返してくれて条件分岐できるってのも気持ち良い。「全ての式が値を返す」という基本思想があるようで、最後に評価した値が戻り値になる。わざわざreturnを書かないという習慣もこれに基づいているということを知りました。