読者です 読者をやめる 読者になる 読者になる

【ruby】ActiveModelを使ってDBと関係ないFormを作成する【Rails】

RailsでFormを扱う時は、Modelと紐付けることで、validationなどの設定はModelに書くことができ、非常に便利です。

ですが、DBと関係ない場合は紐付ける対象のModelが生成されていません。

そこで使用するのがActiveModelです。

https://github.com/rails/rails/tree/master/activemodel

使い方

使い方は簡単で、既存のModelと同じように扱うことができます。

Modelクラスの作成

まずは、Formのプロパティを持ったModelクラスを作成します。
このクラスはActiveModel::Modelをincludeさせます。

class Hoge
  include ActiveModel::Model

  # Formで使用するプロパティを定義する
  attr_accessor :foo, :bar, :piyo

  # Validationを定義する
  validates :foo, presence: true
  validates :bar, presence: true
  validates :piyo, presence: true

end

Controllerでの処理

Controllerでの処理も同じです。
インスタンスを生成する際に値をセットしてあげて、validationを通すことができます。

@hoge = Hoge.new foo: 'FOO', bar: 'BAR'
@hoge.valid? # => false

@hoge = Hoge.new foo: 'FOO', bar: 'BAR', piyo: 'PIYO'
@hoge.valid? # => true

Viewでの処理

Viewも、Modelをform_forに渡す方法で書くことができます。

<%= form_for @hoge, url: '/hoge_create' do |f| %>
    <%= f.text_field :foo %>
    <%= f.text_field :bar %>
    <%= f.text_field :piyo %>
    <%= f.submit %>
<% end %>

注意点

こんなに簡単に書けるのはRails4だけっぽい...?
下記の記事を読むとRails3の時は結構めんどくさそうな実装をしていました。

http://d.hatena.ne.jp/senggonghaza/20130707/1373158508