2006.10.09

Ruby Rails

RailsのActiveFormの使い方

昨日Railsで単一テーブル継承(Single Table Inheritance)の説明の時に作成したメッセージモデルですが、やつは一度に複数のアドレスに送信するものではありません。

でも実際には複数同時に送りたい!!なんて時には、モデルをもう一つかませます。こんな時に間にかますモデルには、ActiveFormを使うと、ValidationとかFormとかも通常のモデル同様行えて良い感じです。

まずはActiveFormプラグインのインストール。(参考:新井選手のブログ

ruby script/plugin install http://www.realityforge.org/svn/code/active-form/trunk/
mv vendor/plugins/trunk vendor/plugins/active_form

あとはMultiMessageクラスを作成。(ここはほんとはアドレスの切り抜きなんかでもうすこしいろいろしないといけないけど、ここでは省略。)

require 'active_form'
 
class MultiMessage < ActiveForm
  attr_accessor :addresses, :body, :title
 
  def to_single_message from
    addresses.each do |address|
      message = Message.new
      message.title = self.title
      message.body = self.body
      message.to_user_address = address
      message.from = from
      unless message.save
        return false
      end
    end
  end
 
  validates_presence_of :addresses, :body, :title
end

通常のモデルと異なるのは、attr_accessorで属性を定義してやることくらい。コントローラ側ではこんな感じで使います。

def messages_controller
  if @multi_message.valid? &&
     @multi_message.to_single_message( @session[:user] )
    flash[:notice] = "送信完了"
    redirect_to some_where_url
  end
end

@active_form_object.valid?でvalidationが実行されます。あとは内部的に適当なモデル(ここではMessageモデル)に変換してDBに保存するメソッドを呼び出して、データを保存すればOK。