¥È¥Ã¥×   ¿·µ¬ °ìÍ÷ ñ¸ì¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS

Ruby/Ruby on Rails/step by step ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥½¡¼¥¹(No.9)

[[Ruby/Ruby on Rails]]

Ruby on Rails¤Ç·«¤êÊÖ¤·Áàºî¤·¤Æ³Ð¤¨¤¿¤¤»öÊÁ¤òstep¤È¤·¤ÆÀ°Íý¤·¤Þ¤·¤¿¡£~

#contents

*step01 InstantRails¤Îµ¯Æ°¤Èirb
C:\InstantRails\InstantRails.exe¤ò¥À¥Ö¥ë¥¯¥ê¥Ã¥¯¤·¤Æµ¯Æ°¤·¤Þ¤¹¡£~
#ref(step01_InstantRails.gif)
~
DOS¥×¥í¥ó¥×¥È²èÌ̤ò³«¤­¡¢irb¤ÇÁàºî¤·¤Æ¤ß¤Þ¤¹¡£~
[I¤Î¥¢¥¤¥³¥ó] - [Rails Applications] - [Open Ruby Console Window]~
#ref(step01_irb.gif)
³Æ¥³¥Þ¥ó¥É¤Î°ÕÌ£
|cmd /f:o|ctrl+f¤Ç¤Î¥Õ¥¡¥¤¥ë̾Êä´°¤òÍ­¸ú¤È¤·¤Þ¤¹|
|ruby -v|ruby¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤·¤Þ¤¹|
|irb -ribr/completion|Êä´°µ¡Ç½Í­¤ê¤Çirb¤òµ¯Æ°¤·¤Þ¤¹|
|pu[tab]|ÅÓÃæ¤Çtab¥­¡¼¤ò²¡¤¹¤ÈÊä´°¤¬¸ú¤­¤Þ¤¹|
|puts "Hello World!"|rubyʸ¤òÂǤĤȤ¹¤°¤Ë¼Â¹Ô¤µ¤ì¤Þ¤¹|
|exit|irb¤ò½ªÎ»¤·¤Þ¤¹|
¤è¤¯»È¤¦Áàºî¤òrails_appsľ²¼¤Î¥Ð¥Ã¥Á¥Õ¥¡¥¤¥ë¤Ë¤·¤Þ¤·¤¿¡£
|setenv.bat|cmd /f:o|
|irb.bat|C:\InstantRails\ruby\bin\irb -rirb/completion|



*step02 ¥×¥í¥¸¥§¥¯¥È¤Î¿·µ¬ºîÀ®
+InstantRails¤«¤éDOS¥×¥í¥ó¥×¥È¤ò³«¤¯~
¥«¥ì¥ó¥È¥Õ¥©¥ë¥À¤ÏC:\InstantRails\rails_apps¤È¤Ê¤ê¤Þ¤¹¡£
+rails ¥×¥í¥¸¥§¥¯¥È̾¤Ç¥×¥í¥¸¥§¥¯¥È¤ò¿·µ¬ºîÀ®
+cd ¥×¥í¥¸¥§¥¯¥È̾¤Ç¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ë°ÜÆ°~
°Ê¹ß¤ÎÁàºî¤Ï¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ç¹Ô¤¤¤Þ¤¹¡£



*step03 Mongrel web¥µ¡¼¥Ð¤Îµ¯Æ°
+¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Çruby script\server¤ò¼Â¹Ô¤·¤ÆMongrel web¥µ¡¼¥Ð¤òµ¯Æ°~
ctrl+c¥­¡¼¤ÇÃæÃǤǤ­¤Þ¤¹¡£
+http://127.0.0.1:3000/¤ò¥Ö¥é¥¦¥¶¤Ç³«¤¯¤È¡¢¥×¥í¥¸¥§¥¯¥È¤ÎWeb¥Ú¡¼¥¸¤¬¸«¤é¤ì¤Þ¤¹¡£



*step04 Aptana Studio RadRails
**UTF-8¤Ë½é´üÀßÄê
+Aptana Studio¤òµ¯Æ°
+ʸ»ú¥³¡¼¥É¤òUTF-8¤Ë½é´üÀßÄê~
[Window] - [Preferences] - [General] - [Workspace] - [Text file encoding]¤òUTF-8¤ÇÀßÄê¤ËÀßÄꤷ¤Þ¤¹¡£
#ref(step04_RadRailsUTF8.gif)



**Rails¥×¥í¥¸¥§¥¯¥È¤Î¥¤¥ó¥Ý¡¼¥È
+[File] - [Import] - [Other] - [Import As New Project] - [Next]
#ref(step04_RadRailsImport01.gif)
+¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤òÀßÄê
#ref(step04_RadRailsImport02.gif)
+¤½¤Î¤Þ¤ÞFinish
#ref(step04_RadRailsImport03.gif)



*step05 ¥Ç¡¼¥¿¥Ù¡¼¥¹ÀßÄê
**config\database.yml¤ò³«¤¤¤Æ¡¢É¬ÍפʾðÊó¤òÆþÎÏ
 development:
   adapter: mysql
   database: ¥×¥í¥¸¥§¥¯¥È̾_development
   username: root
   password:
   host: localhost
 
 test:
   adapter: mysql
   database: ¥×¥í¥¸¥§¥¯¥È̾_test
   username: root
   password:
   host: localhost
 
 production:
   adapter: mysql
   database: ¥×¥í¥¸¥§¥¯¥È̾_production
   username: root
   password: 
   host: localhost



**MySQL¤Î´ûÄê¤Îʸ»ú¥³¡¼¥É¤òUTF-8¤ËÀßÄê
+[Instant Rails] - [I¥¢¥¤¥³¥ó] - [Configure] - [MySql]¤Çmy.ini¤ò³«¤¯
+ËöÈø¤Ë¼¡¤Î£²¹Ô¤òÄɲÃ
 default-character-set=utf8
 skip-character-set-client-handshake



*step06 ¥Ç¡¼¥¿¥Ù¡¼¥¹ºîÀ®
**sql¥³¥Þ¥ó¥É¤ÇºîÀ®¤¹¤ëÊýË¡
+phpMyAdminµ¯Æ°
[Instant Rails] - [I¥¢¥¤¥³¥ó] - [Configure] - [Database(via PhpMyAdmin)]
+SQL¥¢¥¤¥³¥ó¤ò¥¯¥ê¥Ã¥¯
+create database ¥×¥í¥¸¥§¥¯¥È̾_development default charset utf8; 
+ºï½ü¤¹¤ë¤È¤­¤ÏphpMyAdmin¤ò»ÈÍÑ
+´Ä¶­¤òÊѤ¨¤¿DB¤òºîÀ®¤¹¤ë¤È¤­¤Ï¡¢¥³¥Þ¥ó¥É¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹Ì¾¤òÊѹ¹



**rake¥¿¥¹¥¯¤ÇºîÀ®¤¹¤ëÊýË¡
+lib\tasks\setup_db.rake¥Õ¥¡¥¤¥ë¤òºîÀ®
 env = ENV['RAILS_ENV'] || 'development'
 database = "¥×¥í¥¸¥§¥¯¥È̾_#{env}"
 
 task :connect_db => [:environment] do
   ActiveRecord::Base.establish_connection(
     :adapter => 'mysql',
     :host => 'localhost',
     :username => 'root',
     :database => 'mysql'
    )
 end
 
 task :setup_db => [:connect_db] do
   ActiveRecord::Schema.define do
     create_database database
   end
 end
 
 task :destroy_db => [:connect_db] do
   ActiveRecord::Schema.define do
     drop_database database
   end
 end
+¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ç¡Örake setup_db¡×
+ºï½ü¤¹¤ë¤È¤­¤Ï¡Örake destroy_db¡×
+´Ä¶­¤òÊѤ¨¤¿DB¤òºîÀ®¤¹¤ë¤È¤­¤Ï¡Örake RAILS_ENV=production setup_db¡×



*step07 migration¤Ë¤è¤ë¥Æ¡¼¥Ö¥ëºîÀ®
+ruby script\generate migration create_memos_table
+db\migrate\001_create_memos_table.rb¤òÊÔ½¸¡Ê¿ô»ú¤ÏÊѤï¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡Ë
 class CreateTable < ActiveRecord::Migration
   def self.up
     create_table :memos do |t|
       t.column :created_at, :datetime
       t.column :text, :string, :limit => 256
       t.column :location, :string, :limit => 64
     end
   end
 
   def self.down
     drop_table :memos
   end
 end
+¡Örake db:migrate¡×¤Ç¥Þ¥¤¥°¥ì¡¼¥È¤ò¼Â¹Ô
+migration¤Ë¤è¤ê¡¢¸åÆüÎ㤨¤Ðʸ»ú¿ô¤òÊѹ¹~
ruby script\generate migration expand_location
+db\migrate\002_expand_location.rb¤òÊÔ½¸¡Ê¿ô»ú¤ÏÊѤï¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡Ë
 class ExpandLocation < ActiveRecord::Migration
   def self.up
   change_column :memos, :location, :string, :limit => 256
   end
 
   def self.down
   change_column :memos, :location, :string, :limit => 64
   end
 end
+¡Örake db:migrate¡×¤Ç¥Þ¥¤¥°¥ì¡¼¥È¤ò¼Â¹Ô
+¥Ð¡¼¥¸¥ç¥ó£±¤ËÌ᤹¤È¤­¤Ï¡¢~
rake db:migrate VERSION=1



*step08 scaffold¤Ë¤è¤ê¥â¥Ç¥ë¤ª¤è¤Ó¥â¥Ç¥ë¤Ë¥¢¥¯¥»¥¹¤¹¤ë­¾ì¤Î¥Ú¡¼¥¸¤òºîÀ®
¥×¥í¥¸¥§¥¯¥È¥ë¡¼¥È¤Ç¼¡¤Î¥³¥Þ¥ó¥É¤òÆþÎÏ
 ruby script\generate scaffold ¥â¥Ç¥ë̾
 ¢¨¥â¥Ç¥ë̾¤Ï¥¢¥Ã¥Ñ¡¼¥­¥ã¥á¥ë¤Îñ¿ô·Á¤Ç¤¹
Î㤨¤Ð¡Öruby script\generate scaffold Memo¡×¤È¤·¤¿¾ì¹ç¡¢¼¡¤Î¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤Þ¤¹
-http://127.0.0.1:3000/memos/list ... °ìÍ÷
-http://127.0.0.1:3000/memos/new ... ºîÀ®
-http://127.0.0.1:3000/memos/show/id ... ɽ¼¨
-http://127.0.0.1:3000/memos/edit/id ... ¹¹¿·
-http://127.0.0.1:3000/memos/destroy/id ... ºï½ü

¢¨¥³¥ó¥È¥í¡¼¥é¡¼¤¬memos¡¢¥¢¥¯¥·¥ç¥ó¤¬list, new, show, edit, destroy¤È¤Ê¤ê¤Þ¤¹

¼¡¤Î¥Õ¥¡¥¤¥ë¤¬ºî¤é¤ì¤Þ¤¹¡£
-app\models\memo.rb ... ¥â¥Ç¥ë
-app\controllers\memos_controller.rb ... ¥³¥ó¥È¥í¡¼¥é¡¼
-app\views\layouts\memos.rhtml ... Web¥¢¥×¥êÁ´ÂΤΥӥ塼
-app\views\memos\edit.rhtml ... edit¥¢¥¯¥·¥ç¥ó¤Î¥Ó¥å¡¼¡ÊÊÔ½¸¤Î¥Ó¥å¡¼¡Ë
-...



*step09 ¥â¥Ç¥ë¤Ø¤Î¸¡¾Ú½èÍýÄɲÃ
¥â¥Ç¥ë¤Ë¸¡¾Ú¥á¥½¥Ã¥É¤òÄɲä·¤Þ¤¹¡£~
app\models\memo.rb
 class Memo < ActiveRecord::Base
   validates_presence_of :text, :location
   validates_length_of :location, :maximum => 256
   validates_length_of :¥Õ¥£¡¼¥ë¥É̾, :within 6..12
 end
ºÇ¸å¤ÎÎã¤Ï6ʸ»ú°Ê¾å12ʸ»ú°Ê²¼¤Ç¤¹¡£~
¥É¥Ã¥È¤ò£³¤Ã¤Ä¤È¤¹¤ë¤È¡Ö̤Ëþ¡×¤È¤Ê¤ê¤Þ¤¹¡£



*step10 ·îÁªÂò¤Î¥Õ¥©¡¼¥à¤ò±Ñ¸ì¤«¤é¿ô»ú¤ËÊѹ¹
app\views\memos\_form.rhtml
 ...
 <%= datetime_select 'memo', 'created_at', :use_month_numbers => true %></p>
 ...
_form.rhtml¤«¤é¡Öcreated_at¡×¤Îɽ¼¨¤ò´Ý¤´¤Èºï½ü¤¹¤ë¤È¡¢¼«Æ°Åª¤Ë¥Ç¡¼¥¿ºîÀ®Æü»þ¤¬ÀßÄꤵ¤ì¤Þ¤¹¡£



*step11 ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿gem¤ÎAPI¥É¥­¥å¥á¥ó¥È»²¾È
+DOS¥×¥í¥ó¥×¥È¤«¤égem_server¤ÈÆþÎÏ
+¥Ö¥é¥¦¥¶¤Ç¼¡¤Îurl¤ò³«¤¯~
http://127.0.0.1:8808/~
Î㤨¤Ð¸¡¾Ú¤ÇÍѤ¤¤ë¥á¥½¥Ã¥É¤Ï¼¡¤ÎAPI¤ò»²¾È¤·¤Þ¤¹¡£~
[activerecord rdoc] - [ActiveRecord::Validations::ClassMethods]



*step12 Ruby-GetText¤Î¥¤¥ó¥¹¥È¡¼¥ë
+Instant Rails¤òµ¯Æ°¤·¡¢¤½¤³¤«¤éDOS¥×¥í¥ó¥×¥È¤ò³«¤­¤Þ¤¹¡£
+¡Øgettext-1.10.0-mswin32.gem¡Ù¤òÆþ¼ê
+¥³¥Þ¥ó¥É¤òÆþÎϤ·¤Æ¥¤¥ó¥¹¥È¡¼¥ë~
 gem install C:\tmp\gettext-1.10.0-mswin32.gem
È÷¹Í¡§
--¡Ögem install gettext¡×¤ÈÆþÎϤ·¤Æ¡¢¥ª¥ó¥é¥¤¥ó¼èÆÀ¤·¤¿¥á¥Ë¥å¡¼¤«¤éÁªÂò¤¹¤ë¥¤¥ó¥¹¥È¡¼¥ëÊýË¡¤â¤¢¤ë¤½¤¦¤Ç¤¹¤¬¡¢¤Ê¤¼¤«¡ÖGemNotFoundException¡×¤È¤Ê¤ê¥¤¥ó¥¹¥È¡¼¥ë¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£
--¤³¤ì¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤ÎRuby-GetText¤ÏRails 2.0¤Î¤ßÂбþ¤Ç¤¹
--¥¤¥ó¥¹¥È¡¼¥ëÀ衧C:\InstantRails\ruby\lib\ruby\gems\1.8\gems\gettext-1.10.0-mswin32
+GNU GetText¤ò¥¤¥ó¥¹¥È¡¼¥ë~
¡Øruby-gnome2-0.16.0-1-i386-mswin32.exe¡Ù¤òÆþ¼ê¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£~
¥¤¥ó¥¹¥È¡¼¥ëÀ衧C:\InstantRails\ruby\Ruby-GNOME2
+Instant Rails¤òºÆµ¯Æ°



*step13 Ruby-GetText¤òÍøÍѤ¹¤ë¤è¤¦¥×¥í¥¸¥§¥¯¥È¤ËÀßÄê
+¡Øgettext.rake¡Ù¤òlib\tasks¤Ë¥³¥Ô¡¼
+script\server¥³¥Þ¥ó¥É¤ò¼Â¹ÔÃæ¤Î¤È¤­¤Ïctrl+c¥­¡¼¤ÇÄä»ß~
config¥Õ¥©¥ë¥ÀÆâ¤Î¥Õ¥¡¥¤¥ë¤òÊѹ¹¤¹¤ë¤È¤­¤ÏºÆµ¯Æ°¤¬É¬Íפʤ¿¤á¤Ç¤¹¡£
+¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ç¡Örake init_gettext¡×¤ò¼Â¹Ô~
¸µ¤ËÌ᤹¤È¤­¤Ï¡Örake void_gettext¡×¤ò¼Â¹Ô
+ruby script\server¤ÇWeb¥µ¡¼¥ÐºÆµ¯Æ°



*step14 Ruby-GetText¤òÍøÍѤ·¤ÆÆüËܸ첽
+¥Ó¥å¡¼¤Î½ñ¤­´¹¤¨Îã~
app\views\memos\_form.rhtml¤ò¼¡¤Î¤è¤¦¤Ë½ñ¤­´¹¤¨
 <label for="memo_created_at">Create at</label>
         ¢­
 <label for="memo_created_at"><%=h _('Create at')%></label>
app\controllers\memos_controller.rb¤ò¼¡¤Î¤è¤¦¤Ë½ñ¤­´¹¤¨
       flash[:notice] = 'Memo was successfully created.'
         ¢­
       flash[:notice] = _('Memo was successfully created.')
+pot/po¥Õ¥¡¥¤¥ëºîÀ®
 rake update_po
+po¥Õ¥¡¥¤¥ë¤Ëɽ¼¨Ê¸¸À¤òÄêµÁ~
po\ja\memopad.po½ñ¤­´¹¤¨Îã
 #: app/views/memos/_form.rhtml:4
 msgid "Create at"
 msgstr "ºîÀ®ÆüÉÕ"
 ...
 #: app/controllers/memos_controller.rb:26
 msgid "Memo was successfully created."
 msgstr "¥á¥â¤ÎºîÀ®¤ËÀ®¸ù¤·¤Þ¤·¤¿"
+mo¥Õ¥¡¥¤¥ëºîÀ®
 rake make_mo



*step15 ¥Æ¥¹¥È¶îÆ°³«È¯(TDD, Test Driven Development)¤Î½àÈ÷
**¥Æ¥¹¥ÈÍÑDBºîÀ®
¼¡¤Î¤É¤Á¤é¤«¤ÇºîÀ®¤·¤Þ¤¹¡£
-phpMyAdmin SQL¥³¥Þ¥ó¥ÉÆþÎϤÇ~
create database ¥×¥í¥¸¥§¥¯¥È̾_test default charset utf8;
-DOS¥×¥í¥ó¥×¥È ¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ç¤Î¥³¥Þ¥ó¥ÉÆþÎϤÇ~
rake RAILS_ENV=test setup_db


**¥Æ¥¹¥È¤ò¼Â¹Ô
¥×¥í¥¸¥§¥¯¥È¥Õ¥©¥ë¥À¤Ç¡Örake¡×


**ÀÅŪ¥Æ¥¹¥È¥Ç¡¼¥¿ÍÑ°Õ
test\fixtures\memos.yml
 one:
   id: 1
   text: ¥Æ¥¹¥È¥Ç¡¼¥¿#1
   location: ¼«Âð
 two:
   id: 2
   text: ¥Æ¥¹¥È¥Ç¡¼¥¿#2
   location: Ï©¾å

¥Æ¥¹¥È¥Ç¡¼¥¿ ¥×¥í¥°¥é¥àÀ¸À®Îã
 today: <%= Date.today.to_s %>
 created_at: <%= Time.now.to_formatted_s :db %>


**ưŪ¥Æ¥¹¥È¥Ç¡¼¥¿ÍÑ°Õ
test\functional\memos_controller_test.rb
   ...
   def setup
     @controller = MemosController.new
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
 
     @first_id = memos(:one).id ¢«¤³¤Î¤è¤¦¤Ëfirst¤«¤éone¤Ë½ñ¤­´¹¤¨
   end
   ...
   def test_create
     num_memos = Memo.count
 
 ### post :create, :memo => {}
 ###     ¢­¤³¤Î¤è¤¦¤Ë¥Æ¥¹¥È¥Ç¡¼¥¿¤òÄêµÁ
     post :create, :memo => {:text => '¥Æ¥¹¥È¥Ç¡¼¥¿#3', :location => '¥Æ¥¹¥È'}
 
     assert_response :redirect
     assert_redirected_to :action => 'list'
 
     assert_equal num_memos + 1, Memo.count
   end
   ...


**ºÆ¤Ó¡Örake¡×¤Ç¥Æ¥¹¥È¤ò¼Â¹Ô¤·¡¢failures, errors¤¬£°¤È¤Ê¤ë¤³¤È¤ò³Îǧ



*step16 ¥æ¥Ë¥Ã¥È¥Æ¥¹¥È¡Ê¾Êά¡Ë
¡Ø10Æü¤Ç¤ª¤Ü¤¨¤ëRuby on Rails¡Ù148¥Ú¡¼¥¸¤ò¤´»²¾È¤¯¤À¤µ¤¤¡£



*step17 ¥Õ¥¡¥ó¥¯¥·¥ç¥Ê¥ë¥Æ¥¹¥È¡Ê¾Êά¡Ë
¡Ø10Æü¤Ç¤ª¤Ü¤¨¤ëRuby on Rails¡Ù164¥Ú¡¼¥¸¤ò¤´»²¾È¤¯¤À¤µ¤¤¡£