DialogStudio における Rails アプリケーション

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 の行をコメントアウト。

post を使う例

発展させた例。

rails 2.3.2 によるアプリケーション。 実行には Dialog Studio 2.2.4b6 (090910) を使用。

  • submit の namelist 属性の変数名は半角空白で区切る必要がある
  • <field name="id"> / <token slot="id">の属性の値を一致させる必要がある

config/routes.rb

ActionController::Routing::Routes.draw do |map|
  # ....
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
  map.connect ':controller/:action.:format' # この行を追加
end

model の生成

$ ./script/generate model product name:string yomi:string 

test/fixtures/products.yml

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 

app/controllers/application_controller.rb

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

app/controllers/product_controller.rb

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

app/views/product/index.vxml.erb

<?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>

app/views/product/show.vxml.erb

<?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
dialogstudio_rails.txt · 最終更新: 2011/08/07 15:56 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0