めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

Ruby on Rails 3.2のscaffoldからお問い合わせフォーム(確認画面あり)モドキを作ってみた

Ruby on Railsを触ってみることにしました。2008年頃にRubyを触ってはいた(Rubyを勉強しようと思ってはじめた日記 - Rubyist)ので、Rubyは久々です。たしか、この時、Railsを少し試して、仕事で使わなかったから、覚えずに終わってしまいました。今回も、仕事で使う予定はないのですが、Herokuが面白いということもあって、Railsも触ってみよう、と思いました。

というわけで、お問い合わせフォームなんかを作ってみることにしました。今回は、Scaffoldを使って作ってみます。あと、MySQLではなくて、SQLiteで。

インストール

ええと、省きます。
環境は、以下のとおりです。

アプリケーションを用意

$ rails new inquiry
$ cd inquiry

DBの用意

$rake db:create

アクセスしてみる

$ rails s

scaffold

  • この時に、DBの定義がされる
$rails generate scaffold Result name:string mail:string tel:integer body:text

DBを用意

rake db:migrate

新規登録

http://localhost:3000/results/new

  • とうぜん、なんでも登録できる
  • バリデーションが必要

バリデーション設定

class Result < ActiveRecord::Base
     validates :name,  :presence => true
     validates :mail,  :presence => true, :confirmation => true, :format => {:with=>/^[a-zA-z]+$/, :message=>"メールアドレスではありません"}
     validates :mail_confirmation, :presence => true
     validates :tel,   :presence => true
end

テンプレート編集

  • app/views/results/_form.html.erb
  • メールアドレス確認用のmail_confirmationを追加
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :mail %><br />
    <%= f.text_field :mail %>
  </div>
  <div class="field">
    <%= f.label :mail_confirmation %><br />
    <%= f.text_field :mail_confirmation %>
  </div>
  <div class="field">
    <%= f.label :tel %><br />
    <%= f.number_field :tel %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

確認画面を作る

  • バリデーションだけする
  • ルーティングを調整する必要がある
    • Railsのルーティングは、symfonyだとかとも違い、きちんと設定する必要がありそう
    • httpのリソース管理、ということになる
    • RESTfulが基本にある
ルーティング
  • conf/routes.rb
  match "/results/confirm" => "results#confirm"
  resources :results do
  end

コントローラー

  • save(save!)だと保存
    • saveと、save!で意味が違うらしい(が、それはまた今度)
    • !とか?で処理が異なるのは、Ruby的だと思う
  • validateだけを実行したい場合は?
    • valid?というメソッドになる
  • validateが複数ある場合は?については、調査
ソース

app/controllers/results_controller.rb

  # GET /results/confirm
  def confirm
     @result = Result.new(params[:result])
    respond_to do |format|
      if @result.valid?
          # 確認画面
          format.html
      else
          # エラー
          format.html { render :action => "new" }
      end
    end
  end

完了画面

今回作っていないけれど、ルーティングをきちんとすれば出来そう

まとめ

ざっくりとつくってみたけれど(ざっくり過ぎるけれど)、Rails登場以後のフレームワークについて、影響を与えているだけあり、スジの通ったフレームワークの印象を受けました。
もちろん、もっと作って壊し、作って壊ししてみないと、分かってこないことも多いので、もう少し作ってみたいです。

参考

WEB+DB PRESS Vol.58

WEB+DB PRESS Vol.58