Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

hashieでHash型を便利に拡張する(その4_Dashで入力ルールを定める)

DashはHashに対して入力ルールを定める拡張です。

class User < Hashie::Dash
  property :name, required: true
  property :type, default: :normal
end 
shuzo = User.new(name: :Shuzo)
#=> {:type=>:normal, :name=>:Shuzo}

vivit = User.new(name: :Vivit, type: :writeLater)
#=> {:type=>:writeLater, :name=>:Vivit}

例の如く、メソッドみたいに値を呼び出せます。便利です。

vivit.name
=> :Vivit

使用上の注意

シンボルと文字列は別の扱い

シンボルと文字列はそれぞれ別物として扱われます。
メソッド風に呼び出した場合、実行されるのはシンボルの方です。

class Tricky < Hashie::Dash
  property :trick
  property 'trick'
end

p = Tricky.new(trick: 'one', 'trick' => 'two')
p.trick # => 'one', always symbol version
p[:trick] # => 'one'
p['trick'] # => 'two'

文字列しか定義していない場合・・・メソッド式では呼び出せません

class Tricky < Hashie::Dash
  property 'trick'
end

p = Tricky.new('trick' => 'two')
p.trick # => NoMethodError

Strong Parametersとの兼ね合い

権限だの初期値だのがStrong Parametersぽいですが・・・
実際公式でも考えてはいるようで、
hashie_railsというgemがでてます。