Active_Form

ActiveRecordの機能でテーブル項目に対してvalidationを行うことができますが、
テーブル項目として存在しない項目に対してはvalidationができません。
ActiveFormは、そのテーブル項目として存在しない項目に対してvalidationを行うことができる機能です。


1.通常のインストール(挫折)

WindowsXPの環境下でGitを導入したあと通常のインストールを試みましたが、うまくいきません。
ちなみにGitはhttp://code.google.com/p/msysgit/からダウンロードしました。

コマンド プロンプト

D:\Rails_Project\proj000>ruby script/plugin install git://github.com/cs/active_form.git
Initialized empty Git repository in D:\Rails_Project/proj000/vendor/plugins/active_form/.git/
ここから一歩も動かず


2.奥の手のインストール

(1) Active_Formのダウンロード
Active_Formはhttp://github.com/cs/active_formにあるので、
ここから直接ダウンロードして来ることにしました。
cs-active_form-1ed313d.zipをダウンロードします。
    


(2) /vendor/plugins/配下にコピー
解凍したフォルダをactive_formにリネームして/vendor/plugins/配下にコピーします。


3.active_form.rbの修正(rails2.3以降であれば不要)

rails2.2で実行したとき下記のエラーになったときの対処です。
rails2.3では起きませんでした。


undefined method `self_and_descendents_from_active_record' for xxxxxxxx:Class


導入したactive_form.rbを修正します。

/vendor/plugins/active_form/lib/active_form.rb

class ActiveForm


class <self_and_descendents_from_active_record
[self]
end

def human_name(*args)
name.humanize
end


end
end



4.使用例
4−1.プロジェクトの生成
(1) プロジェクトAppli004を生成する
(2) 日本語環境の設定
(3) データベースの作成


4−2.モデルの生成
NetBeansで[生成]を選択
 ジェネレータ(G): model
 引数(A): triangle

実行結果

exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/triangle.rb
create test/unit/triangle_test.rb
create test/fixtures/triangles.yml
create db/migrate
create db/migrate/20091126075833_create_triangles.rb

データベーステーブルは使用しないのでマイグレーションは実行しません。
db/migrate/20091126075833_create_triangles.rbは削除します。


4−3.モデルの修正

/app/models/triangle.rb

require 'active_form'

class Triangle < ActiveForm
attr_accessor :a, :b, :c
validates_presence_of :a, :b, :c
validates_numericality_of :a, :b, :c

end




4−4.コントローラとビューの生成
NetBeansで[生成]を選択
 ジェネレータ(G): controller
 名前(N): triangle
 ビュー(V): index calculate

実行結果

exists app/controllers/
exists app/helpers/
create app/views/triangle
exists test/functional/
create test/unit/helpers/
create app/controllers/triangle_controller.rb
create test/functional/triangle_controller_test.rb
create app/helpers/triangle_helper.rb
create test/unit/helpers/triangle_helper_test.rb
create app/views/triangle/index.html.erb
create app/views/triangle/calculate.html.erb


4−5.入力ブログラムの作成

/app/views/triangle/index.html.erb

<h1>三角形の面積はどのくらいか</h1>
<div id="triangle">
<%= error_messages_for :triangle %>
<% form_tag :action=>"calculate" do %>
辺a:<%= text_field :triangle, :a %><br/><br/>
辺b:<%= text_field :triangle, :b %><br/><br/>
辺c:<%= text_field :triangle, :c %><br/><br/>
<%= submit_tag "面積計算" %>
<% end %>
</div>


4−6.面積計算プログラムの作成

/app/controllers/triangle_controller.rb

class TriangleController < ApplicationController
def index
end

def calculate
@triangle = Triangle.new(params[:triangle])
if @triangle.valid?
x=@triangle.a.to_f
y=@triangle.b.to_f
z=@triangle.c.to_f
fg="ON"
fg="off" if x+y<=z
fg="off" if x+z<=y
fg="off" if y+z<=x

if fg=="ON" then
s=(x+y+z)/2
area=Math::sqrt(s*(s-x)*(s-y)*(s-z))
@result = "辺の長さ #{x}, #{y}, #{z} の三角形の面積は#{area}"
else
@result = "辺の長さ #{x}, #{y}, #{z} では三角形はできない"
end
else
render :action => "index"
end
end
end



4−7.結果表示のプログラム

/app/views/triangle/calculate.html.erb

<h1>三角形の面積</h1>
<%= "#{@result}" %>
<% form_tag :action=>"index" do %>
<%= submit_tag "戻る" %>
<% end %>


4−8.動作確認

(1) 正しいデータの場合
    


    

(2) 誤ったデータの場合