simon_lin 发表于 2013-1-27 06:12:49

Ruby on Rails之InstantRails使用

                        Ruby on Rails之InstantRails使用                                    進入網站 http://instantrails.rubyforge.org/wiki/wiki.pl?Instant_Rails 
            選擇 下載 Instant Rails 1.3
            http://instantrails.rubyforge.org/wiki/wiki.pl?Getting_Started 裡有安裝的詳細內容
            解壓至C:\InstantRails , 點選InstantRails.exe
            會自動檢查 apache, mysql, phpmyadmin (Rails裡亦包含這些)
            http://localhost/   進入網站
            http://localhost/mysql/   進入phpmyadmin管理mysql server
            (mysql default user為root, 沒有password)
            點選 Configure > Windows Hosts file
            加入
            127.0.0.1 www.mycookbook.com
            127.0.0.1 typo
            點選 Rails Applications > Manage Rails Applications...
            然後選擇 cookbookc 並按下 "Start SCGI" button.
            輸入 http:\\www.mycookbook.com\ 進入網站
            在玩Rails前,先來認識一下Ruby:
            在windows os下, 進入 cd\InstantRails\ruby\bin
            執行:ruby -v
            查看ruby版本
            執行:irb
            進入Ruby shell可進行邏輯運算
            執行:irb --simple-prompt
            然後輸入 print('Joeyta') 就可看到輸出
            建主c:\joeyta.rb, 內容為:
            print ("My name is:")         # 括孤可有可無
            puts "Joeyta"                 # puts的輸出自動輸行
            print "What is your name?\n"  # double quote可解釋escape字元
            puts 'Peter Chan\n'           # single quote直接輸出所有字元
            print '1+1 ='; puts 1+1       # 傳回 1+1=2
            puts "abc"=="abc"             # 傳回true
            a = "ab"; b = "ab"
            puts "ab".eql?"ab"            # 傳回true,判斷實際值
            puts "ab".equal?"ab"          # 傳回false,判斷參考位置
            puts 10 > 50                  # 傳回false
            puts "abcd".index('c')        # 傳回2
            name = "joeyta"; 
            printf("名: %s\n", name)      # printf可作格式化
            printf("是否joeyta? %s\n", (name == 'joeyta' ? '是' : '否'))
            number=gets.to_i              # gets取後輸入,to_i轉成數字,給變數number
            puts number                 
            if number == 1         # if表達式
             puts '輸入為1'
            elsif number == 2
             puts '輸入為2'
            else
             puts '輸入不為1,2'
            end
            unless number == 1            # number不為1時為true
             puts '輸出不為1'
            else
             puts '輸出為1'
            end
            case number                   # case 表達式
             when 1
              puts 'case 1'
             when 2
              puts 'case 2'
             else
              puts 'case 1,2'
            end
            for i in 0..2
               print i,"\n"
            end
            for element in    
             print "#{element}\t(#{element.class})\n"
            end
            (0..2).each {|i| puts i}
            (9..12).each do |i| puts i end
            2.times {puts "joeyta"}
            3.times do |i| puts "peter" end
            j = 1000
            begin
             j -= 1
             puts j
             if j==997
              break
              end
            end while j>=995               # 亦可使用until
            (1..5).each do |num|
             print num   
             if num == 4         
              break                      # 亦可使用redo繼續, next下一個, retry重試迴路
             end                        
            end
            
            values =
            values.length.times do |index|   
            print values, " "
            end
            ary = Array.new(3).fill { "foo" }
            ary.replace "bar"
            p ary
            執行
            c:\InstantRails\ruby\bin>ruby c:\joeyta.rb
            玩完Ruby後,現在來玩一下Rails:
            c:\InstantRails\ruby\bin>rails C:\InstantRails\rails_apps\mybook
            就會在C:\InstantRails\rails_apps\ 目,建主mybook的application及相關的檔案
            執行
            ruby C:\InstantRails\rails_apps\mybook\script\server
            或到Instant Rails > I > Rails Application > Manage Rails Applications
            點選mybook 及 按 "Start with WEBrick"
            就會啟動網站
            輸入http://127.0.0.1:3000/ 進入網站
            執行ruby C:\InstantRails\rails_apps\mybook\script\generate controller MyTest
            編輯C:\InstantRails\rails_apps\mybook\app\controllers\my_test_controller.rb 為
            class MyTestController < ApplicationController
             def index
               render_text "Hello World"
             end
            end
            輸入 http://127.0.0.1:3000/My_Test/ 就能看到 Hello World
            繼續編輯 C:\InstantRails\rails_apps\mybook\app\controllers\my_test_controller.rb
            class MyTestController < ApplicationController
             def index
               render_text "Hello World"
             end
             def hello
               render_text "Hello Rails"
             end
            end
            輸入 http://127.0.0.1:3000/My_Test/hello  就看到 Hello Rails
            
            建立資料庫:
            進入 http://localhost/mysql/
            執行:
            create database mybook;
            create table books(
            id int(11) auto_increment primary key,
            title varchar(100),
            description text,
            buydate date)
            修改 C:\InstantRails\rails_apps\mybook\config\database.yml 
            (YAML配置檔,詳情可參考 http://www.yaml.org/ 及 http://www.ruby-doc.org/core/classes/YAML.html)
            development:
              adapter: mysql
              database: mybook
              username: root
              password:
              host: localhost
            test:
              adapter: mysql
              database: mybook
              username: root
              password:
              host: localhost
            production:
              adapter: mysql
              database: mybook
              username: root
              password:
              host: localhost
             
            執行
            ruby C:\InstantRails\rails_apps\mybook\script\generate model book
            就會在C:\InstantRails\rails_apps\mybook\app\models 下產生 book.rb
            Rails智能地把Book mapping 至 mysql 的books table.
            (創建model book就會將Book映射至英文眾數的book talbe,即books table)
            
            執行
            ruby C:\InstantRails\rails_apps\mybook\script\generate controller book
            編輯 C:\InstantRails\rails_apps\mybook\app\controllers\book_controller.rb
            class BookController < ApplicationController
             scaffold:book      # scaffold:book 生成CRUD代碼
            end
            輸入 http://127.0.0.1:3000/book/new
            不可思意地竟然產生了UI 讓用戶新增 修改 刪除 數據到mysql books table.
            編輯 C:\InstantRails\rails_apps\mybook\app\controllers\book_controller.rb
            class BookController < ApplicationController
             scaffold:book
             def list
            end
            當輸入 http://127.0.0.1:3000/book/new 會出現缺少template的錯誤頁面
            新增
            C:\InstantRails\rails_apps\mybook\app\views\book\list.rhtml 內容為
            <html>
            <head>
            <title>All books</title>
            </head>
            <body>
            <h1>Online Mybook - All books</h1>
            <table border="1">
            <tr>
             <td width="80%"><p align="center"><i><b>book</b></i></td>
             <td width="20%"><p align="center"><i><b>Date</b></i></td>
            </tr>
            <% @books.each do |book| %>
            <tr>
             <td><%= link_to book.title, :action => "show", :id => book.id %></td>
             <td><%= book.buydate %></td>
            </tr>
            <% end %>
            </table>
            <p><%= link_to "Create new book", :action => "new" %></p>
            </body>
            </html>
            修改 C:\InstantRails\rails_apps\mybook\app\controllers\book_controller.rb
            class BookController < ApplicationController
             scaffold:book
             def list
              @books = Book.find_all
             end
            end
            輸入 http://127.0.0.1:3000/book/list 就會出現自定的list template
            
            進入 http://localhost/mysql/
            use mybook;
            create table categories(
             id int(11) auto_increment primary key,
             name varchar(50)
            );
            alter table books add category_id int(11) not null after description;
            INSERT INTO `categories` VALUES (1, '小說');
            INSERT INTO `categories` VALUES (2, '科幻');
            INSERT INTO `categories` VALUES (3, '漫畫');
            INSERT INTO `books` VALUES (1, '天海', '天海一閣', 1, '2006-04-28');
            INSERT INTO `books` VALUES (2, '好書', '好書一本', 2, '2006-04-29');
            
            執行
            ruby C:\InstantRails\rails_apps\mybook\script\generate model category
            ruby C:\InstantRails\rails_apps\mybook\script\generate controller category
            修改 C:\InstantRails\rails_apps\mybook\app\model\book.rb
            class Book < ActiveRecord::Base
             belongs_to :category
            end
            修改 C:\InstantRails\rails_apps\mybook\app\model\category.rb
            class Category < ActiveRecord::Base
             has_many :books
            end
            修改 C:\InstantRails\rails_apps\mybook\app\controllers\book_controller.rb
            class BookController < ApplicationController
             scaffold:book
             def list
              @books = Book.find_all
             end
             def edit
              @book = Book.find(@params["id"])
              @categories = Category.find_all
             end 
            end
            
            新增C:\InstantRails\rails_apps\mybook\app\views\book\list.rhtml 內容為
            <html>
            <head>
            <title>Edit book</title></head>
            <body>
            <h1>Edit book</h1>
            <form action="../update" method="POST">
             <input id="book_id" name="book" size="30" type="hidden" value="<%= @book.id %>" />
             <p><b>Title</b><br>
              <input id="book_title" name="book" size="30" type="text" value="<%= @book.title %>" /> </p>
             <p><b>Description</b><br>
               <input id="book_description" name="book" size="30" type="text" value="<%= @book.description %>" /> </p>
             <p><b>Category:</b><br>
             <select name="book">
              <% @categories.each do |category| %>
               <option value="<%= category.id %>" <%= ' selected' if category.id == @book.category.id %>> <%= category.name %>
               </option>
              <% end %>
             </select></p>
             <input type="submit" value="Update" />
            </form>
             <a href="/book/show/<%= @book.id %>"> Show </a> | <a href="/book/list"> Back </a>
            </body>
            </html>
                     
页: [1]
查看完整版本: Ruby on Rails之InstantRails使用