dialogstudio のための、 さまざまな Ruby on Rails + VoiceXML アプリケーションについて検討する。
Galatea Dialog Studio 2.3.0 (100529) を使用。
http://sourceforge.jp/projects/galatea/wiki/JapaneseTutorial
/usr/local/bin/ruby として ruby 1.9.2-p0 を使っている。
他のバージョンの rails がインストール済みかも知れないのでバージョンを指定して使う。
$ sudo gem install -v=2.3.8 rails $ rails _2.3.8_ dialog
下記と同じく app/controllers/application_controller.rb の protect_from_forgery の行をコメントアウト。
発展させた例。
rails 2.3.2 によるアプリケーション。 実行には Dialog Studio 2.2.4b6 (090910) を使用。
ActionController::Routing::Routes.draw do |map| # .... map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' map.connect ':controller/:action.:format' # この行を追加 end
$ ./script/generate model product name:string yomi:string
p01: name: 玉子丼 yomi: たまごどん price: 550 p02: name: のり弁 yomi: のりべん price: 580 p03: name: おにぎりセット yomi: おにぎりせっと price: 600 p04: name: のりメンタイ yomi: のりめんたい price: 600
$ rake db:migrate $ rake db:fixtures:load
$ ./script/generate controller product
protect_from_forgery を無効化する必要がある。
class ApplicationController < ActionController::Base helper :all # include all helpers, all the time # protect_from_forgery # See ActionController::RequestForgeryProtection for details # Scrub sensitive parameters from your log # filter_parameter_logging :password end
class ProductController < ApplicationController def index @products = Product.find(:all) end def show @product = Product.find(params[:id]) @name = @product.name @num = params[:num].to_i @amount = @num * @product.price.to_i end end
<?xml version="1.0"?> <vxml version="2.0" xml:lang="ja"> <form id='main'> <block><log>商品リスト</log></block> <field name='id'> <prompt timeout='20s'> <% @products.each do |p| -%> <%=h p.name -%>、 <% end -%> </prompt> <grammar version='1.0' root='#product'> <rule id='product'> <one-of> <% @products.each do |p| -%> <item> <token sym="<%=h p.yomi %>" slot="id" value="<%=h p.id %>"> <%=h p.name %> </token> </item> <% end -%> <item> <token sym="まいくてすと">マイクテスト</token> </item> </one-of> </rule> </grammar> </field> <field name="num"> <prompt>一個ですか、二個ですか</prompt> <grammar root="#num"> <rule id="num"> <one-of> <item> <token sym="いっこ" slot="num" value="1">一個</token> </item> <item> <token sym="ふたこ" slot="num" value="2">二個</token> </item> </one-of> </rule> </grammar> </field> <block> <submit method="post" namelist="id num" next="<%= url_for(:action=>'show', :format=>'vxml') %>"/> </block> </form> </vxml>
<?xml version="1.0"?> <vxml version="2.0" xml:lang="ja"> <form id='main'> <block> <prompt> <%=h @name %>は<%=h @num %>個で<%=h @amount %>円です。<break time="1s"/> </prompt> <goto next="<%= url_for(:action=>'index', :format=>'vxml') %>" /> </block> </form> </vxml>
端末を二つ用意する。
端末1:
$ script/server
端末2:
$ galatea-runner http://localhost:3000/product/index.vxml