ActiveModel::Attributes APIの attribute
メソッドを使用して値のcastを行う場合に、shoulda-matchersが提供するマッチャを使ってバリデーションのテストを行おうとすると
意図しない挙動によってテストが落ちてしまう。
class SampleForm
include ActiveModel::Model
include ActiveModel::Attributes
DDDのアグリゲート | |
e.g: オブジェクトの所有権と境界を定義するのに使うパターン | |
↓ (僕の理解) | |
アグリゲートは、そのアグリゲートに属する複数オブジェクト間のデータの不変性を保証する | |
(rails のhas_many の inverse_of や dependent: :destroy などが例) | |
あるアグリゲート(ここではAとする)は一つのルートを持ち、Aのアグリゲートに属さない外部のオブジェクトからAのアグリゲートに属するオブジェクトにメッセージを送りたい場合は、ルートを通してでしかアクセスできない。 | |
アグリゲート内のオブジェクトは、お互いを参照できる(ex: has_one, belongs_toなど)。 |
class DateBase | |
def self.get_property(mail_address) | |
self.resources.select { |resource| resource[0] == mail_address }.last[1] | |
end | |
def self.resources | |
[ | |
['uchinishi@mf.com', '4geru'], | |
['nandate@mf.com', 'tnandate'] | |
] |
require 'singleton' | |
class BigChar | |
attr_accessor :charname, :fontdata | |
def initialize(charname) | |
@charname = charname | |
begin | |
line = "" |
# なぜやるか | |
役割が単一なクラスの仕様が変更になった場合、その変更部分は把握しやすいから。 | |
単一でない場合、1つの箇所を変えた時にどのような挙動が起こるか想定しずらくこれはもろい設計に当てはまる。 | |
# どう分けるか | |
変更する理由が同じ場合は同じクラス(やモジュールとか)に、理由が異なる場合は違うクラスに分けるべき。 | |
下記の例だとEmployeeクラスに住んでいる3つのメソッドはそれぞれ異なる理由で変更される可能性がある。 | |
calculate_payrollは給与計算の計算式が変更されたら対応して修正しないといけないし、report_hoursはレポートのフォーマットが変更されるたびに修正が必要だ。つまり今のEmployeeクラスは様々な変更される理由を持っていて、そのたびにこのクラスとこのクラスに依存している他のクラスや処理を変更しないといけなくなる。 | |
最適なクラス設計は、calculate_payrollが変更されても、この処理に依存していた他のクラスのインタフェースには変更が入らないことだ。 |
begin | |
require 'bundler/inline' | |
rescue LoadError | |
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler' | |
raise | |
end | |
gemfile(true) do | |
source 'https://rubygems.org' |
begin | |
require 'bundler/inline' | |
rescue LoadError | |
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler' | |
raise | |
end | |
gemfile(true) do | |
source 'https://rubygems.org' |
class HogesController | |
before_action :set_hoge | |
before_action :redirect_to_home_path_if_request_invalid | |
def create | |
if @hoge.save(hoge_params) | |
# ok | |
else | |
render :new | |
end |
NameError: undefined local variable or method `view_context' for #<TestController:0x00007fd232cc0f40> | |
Did you mean? view_runtime> with backtrace: | |
# ./.bundle/gems/active_decorator-1.3.0/lib/active_decorator/monkey/action_controller/base/rescue_from.rb:10:in `rescue_with_handler' | |
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/rescue.rb:25:in `rescue in process_action' | |
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/rescue.rb:21:in `process_action' | |
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action' | |
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `block in instrument' | |
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:23:in `instrument' | |
# ./.bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `instrument' | |
# ./.bundle/gems/actionpack-5.2.3/lib/action_controller/metal/instrumentation.rb:32:in `process_action' |