パRails🚂
rails s
できない可能性が高いです。
@motohiro-mm
11-3-4 473p コラム「サービスオブジェクトの実装ルールやインターフェースについて」から
PR:
476P 12-2 「データベースと紐づかないモデルを作る」から 🚂
@sharoa
@sugiwe
@shodan
@sadanora
Module#private_class_method
@moegi29
@motohiro-mm
self.call
)private_class_method :new
)@sakanobu
user.save
の次の行あたりベタ書きすることも出来るが、Rails の基本的なアプローチは User モデル内で after_create :<メール送信用の private メソッド名>
などのように実装する、つまり、モデルにユースケースのロジックを集めていくということに気をつける
※3月の第1週は4日のみの活動となったため、第2週目もこちらに記載します。
@moegi29
476P 12-2 「データベースと紐づかないモデルを作る」から
12-2-2 「ActiveModelとは」の途中まで。
PR:
481p 「🔳 ActiveModel::Validations」から。🚂
@sharoa
@moegi29
motohiro-mm
define_model_callbacks 対象メソッド
run_callbacks
メソッドのブロックで囲う必要があるextend
なのか気になりました
define_model_callbacks
はクラスメソッドだからです。include
して生えるのはインスタンスメソッドsakanobu
@shodan
form_with
とか)。ActiveModel
というライブラリが便利。
ActiveModel::Attributes
は型を持つ属性を簡単に定義できる。ActiveModel::Callbacks
はコールバック機能を簡単に定義できる。ActiveModel::Serialization
はモデルのインスタンスのシリアライズ機能(別の形式、XMLやJSONへの変換)を簡単に定義できる。@sadanora
ActiveModel
によってActiveRecordと同じ機能を色々使えるようにできる。Ruby上のオブジェクトを何らかのファイルに出力しておいて、あとでまた読み込み直せるようにすること
@sugiwe
ActiveModel::Attributes
で自動の型変換をしてくれる、など@cafedomancer
@sugiwe
481p 「🔳 ActiveModel::Validations」から
12-3-3 「実装例」まで。
PR:
12-3-4 「共通のバリデーションルールを定義する」から。🚂
@sharoa
@sugiwe
.downcase.titleize
と.capitalize
は動作としては同じ?? .titleize
はRails(ActiveSupport)のメソッドらしい@sakanobu
validate :fugapiyo_validate, if: hoge?
の if: hoge?
のような条件分岐もドンドン増えていくと、「え、自分のユースケースに関係ないバリデーションが発火しちゃってバリデーションが通らない…」みたいなことが起きるのはたしかに想像できるので、特殊なユースケースのロジックは分離しようね!という話だと理解しました@shodan
form_with
で属性を設定するモデルのオブジェクトとして、@user
とかではなく@user_registration_form
のようなフォームを抽象化したモデルを渡すようにする作戦。user_registration_form.save
のようなメソッドを自分で定義しておき、そのsave
の中でUser.new.save
のような登録処理や、そのあとのメール送信処理などを用意しておく。app
というオブジェクトからルーティングヘルパーにアクセスできることを初めて知りました!知見。https://railsguides.jp/command_line.html#appオブジェクトとhelperオブジェクト@motohiro-mm
before_validation
,after_validation
はActiveModel::Validations::Callbacks@sadanora
form_with
との連携に必要なインターフェースを持たせたものをフォームオブジェクトという。@moegi
@sugiwe
12-3-4 「共通のバリデーションルールを定義する」から
12-4-2 「プレゼンター」まで。
PR:
12-4-3 「ActiveDecorator」から。🚂
@sharoa
ActiveModel::EachValidator
とActiveModel::Validator
が用意されている。ActiveModel::EachValidator
⇨あるひとつの属性のバリデーションルールを定義する時に利用するもの。(本での例だと、emailのフォーマットに関するルール。)ActiveModel::Validator
⇨複数の属性を組み合わせたバリデーションルールなど、より複雑なルールを定義するときに利用するもの。@sugiwe
ActiveModel::EachValidator
は1つの属性のバリデーションルールを定義する時に使う
ActiveModel::Validator
は複数の属性を組み合わせたバリデーションルールを定義する時に使う
@sakanobu
validates :email, hoge_fuga: true
とすれば HogeFugaValidator の new などをしなくても勝手にバリデーションのインスタンスの生成やその実行をしてくれるというのはまさに Rails の設定より規約という思想だなぁと感じました@sadanora
ActiveModel::EachValidator
より複雑なルールを定義できるapp/helpers
配下に追加すると、すべてのコントローラーのビューで使えてしまう。
@moegi29
@motohiro-mm
12-4-3 「ActiveDecorator」から
PR:
13-1-4 「ActiveSupport::Concern」から。🚂
@sharoa
Active Decorator
では、プレゼンターに実装したメソッドは基本的にはビューの中でしか使えない。@sadanora
ActiveDecorator
などのgemを使う。@moegi29
@sakanobu
@motohiro-mm
#{対象のモデル名}Decorator
なので#{対象のモデル名}Presenter
に書き換える
@shodan
rails s
してみよう、みたいなところから始まるチュートリアルなんですが、最後にがっつりConcernの説明が出てきます。@sugiwe
13-1-4 「ActiveSupport::Concern」から
13-1-5 「ルーティングにおけるConsern」まで。
PR:
13-2 「コールバックオブジェクト」から。🚂
@sugiwe
@sakanobu
@shodan
included
メソッドに渡したブロックclass_methods
メソッドに渡したブロックActiveSupport::Concern
をextendして作られたモジュールの継承関係の解決
ActiveSupport::Concern
をextend
して定義しておくと、最終的にCではBを読み込むだけで継承関係を意識せずに(?)使うことができるようになる@sadanora
ActiveSupport::Concern
のclass_methods
を使うとクラスメソッドの定義を容易に出来る
ActiveSupport::Concern
をextendすると、これができるようになる →まじか@ motohiro-mm
module ClassMethods def メソッド名 ~ end end