Ruby on Rails 2.1 - Giàn giáo

Trong khi bạn đang phát triển các ứng dụng Rails, đặc biệt là những ứng dụng chủ yếu cung cấp cho bạn một giao diện đơn giản với dữ liệu trong cơ sở dữ liệu, thì việc sử dụng phương pháp giàn giáo thường có thể hữu ích.

Giàn giáo cung cấp nhiều hơn những trò chơi cảm giác mạnh demo giá rẻ. Dưới đây là một số lợi ích -

  • Bạn có thể nhanh chóng nhận mã trước mặt người dùng của mình để phản hồi.

  • Bạn được thúc đẩy bởi thành công nhanh hơn.

  • Bạn có thể tìm hiểu cách Rails hoạt động bằng cách xem mã đã tạo.

  • Bạn có thể sử dụng giàn giáo làm nền tảng để bắt đầu sự phát triển của mình.

Ví dụ về giàn giáo

Ruby on Rails 2.0 thay đổi cách Rails sử dụng giàn giáo. Để hiểu về giàn giáo , hãy tạo một cơ sở dữ liệu có têncookbook và một bảng được gọi là recipes. -

Tạo một ứng dụng web Rails rỗng

Mở cửa sổ lệnh và điều hướng đến nơi bạn muốn tạo cookbookứng dụng web. Chúng tôi đã sử dụng c: \ ruby. Chạy lệnh sau để tạo cấu trúc thư mục hoàn chỉnh và cơ sở dữ liệu MySQL tệp .yml bắt buộc .

C:\ruby> rails -d mysql cookbook

Ở đây chúng tôi đang sử dụng -d mysqlđể xác định sở thích của chúng tôi để sử dụng cơ sở dữ liệu MySQL. Chúng tôi có thể chỉ định bất kỳ tên cơ sở dữ liệu nào khác như oracle hoặc postgress bằng cách sử dụng-dLựa chọn. Theo mặc định, Rails sử dụngSQLite cơ sở dữ liệu.

Thiết lập cơ sở dữ liệu

Đây là cách để tạo cơ sở dữ liệu -

mysql> create database cookbook;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on cookbook.*
 to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Để hướng dẫn Rails định vị cơ sở dữ liệu, hãy chỉnh sửa tệp cấu hình ~ \ cookbook \ config \ database.yml và thay đổi tên cơ sở dữ liệu thành sách nấu ăn. Khi bạn hoàn thành, nó sẽ trông như sau:

development:
   adapter: mysql
   encoding: utf8
   database: cookbook
   username: root
   password: password
   host: localhost
test:
   adapter: mysql
   encoding: utf8
   database: cookbook
   username: root
   password: password
   host: localhost
production:
   adapter: mysql
   encoding: utf8
   database: cookbook
   username: root
   password: password
   host: localhost

NOTE - Bạn có thể sử dụng các cài đặt tương tự cho các bộ điều hợp cơ sở dữ liệu khác trong trường hợp bạn muốn sử dụng bất kỳ cơ sở dữ liệu nào khác ngoại trừ MySQL.

Rails cho phép bạn chạy ở chế độ phát triển, chế độ thử nghiệm hoặc chế độ sản xuất, sử dụng các cơ sở dữ liệu khác nhau. Ứng dụng này sử dụng cùng một cơ sở dữ liệu cho mỗi.

Định nghĩa bảng cơ sở dữ liệu

Giả sử cấu trúc sau đây cho recipes bàn -

id INT(11) 
title VARCHAR(40)
chef VARCHAR(40)
instructions VARCHAR(255)

Mã giàn giáo đã tạo

Với hành động giàn giáo , Rails tự động tạo ra tất cả mã mà nó cần. Bằng cách chạy giàn giáo dưới dạng tập lệnh, tạo mô hình, cùng với giàn giáo và tập lệnh di chuyển cơ sở dữ liệu cần thiết cũng như bộ điều khiển, trình trợ giúp và các tệp hỗ trợ thử nghiệm như sau:

cookbook> ruby script/generate scaffold Recipe title:string \
chef:string instructions:text

Lưu ý tên số ít Công thức để tạo công thức tên bảng số nhiều . Tuy nhiên, lệnh trên sẽ tạo ra các thông báo sau:

exists  app/models/
   exists  app/controllers/
   exists  app/helpers/
   create  app/views/recipes
   exists  app/views/layouts/
   exists  test/functional/
   exists  test/unit/
   exists  public/stylesheets/
   create  app/views/recipes/index.html.erb
   create  app/views/recipes/show.html.erb
   create  app/views/recipes/new.html.erb
   create  app/views/recipes/edit.html.erb
   create  app/views/layouts/recipes.html.erb
   create  public/stylesheets/scaffold.css
   create  app/controllers/recipes_controller.rb
   create  test/functional/recipes_controller_test.rb
   create  app/helpers/recipes_helper.rb
   route  map.resources :recipes
dependency  model
   exists    app/models/
   exists    test/unit/
   exists    test/fixtures/
   create    app/models/recipe.rb
   create    test/unit/recipe_test.rb
   create    test/fixtures/recipes.yml
   create    db/migrate
   create    db/migrate/20080614192220_create_recipes.rb
cookbook>

Bây giờ, chúng ta hãy xem xét những gì đã xảy ra đằng sau hiện trường.

Bộ điều khiển

Hãy xem mã đằng sau bộ điều khiển. Mã này được tạo bởiscaffoldmáy phát điện. Nếu bạn mở app / controllers / cook_controller.rb, bạn sẽ thấy một vài thứ như sau:

class RecipesController < ApplicationController
   # GET /recipes
   # GET /recipes.xml
   def index
      @recipes = Recipe.find(:all)

      respond_to do |format|
         format.html # index.html.erb
         format.xml  { render :xml => @recipes }
      end
   end

   # GET /recipes/1
   # GET /recipes/1.xml
   def show
      @recipe = Recipe.find(params[:id])

      respond_to do |format|
         format.html # show.html.erb
         format.xml  { render :xml => @recipe }
      end
   end

   # GET /recipes/new
   # GET /recipes/new.xml
   def new
      @recipe = Recipe.new

      respond_to do |format|
         format.html # new.html.erb
         format.xml  { render :xml => @recipe }
      end
   end

   # GET /recipes/1/edit
   def edit
      @recipe = Recipe.find(params[:id])
   end

   # POST /recipes
   # POST /recipes.xml
   def create
      @recipe = Recipe.new(params[:recipe])

      respond_to do |format|
      if @recipe.save
         flash[:notice] = 'Recipe was successfully created.'
         format.html { redirect_to(@recipe) }
         format.xml  { render :xml => 
            @recipe, :status => :created, :location => @recipe }
      else
         format.html { render :action => "new" }
         format.xml  { render :xml => 
            @recipe.errors, :status => :unprocessable_entity }
         end
      end
   end

   # PUT /recipes/1
   # PUT /recipes/1.xml
   def update
   @recipe = Recipe.find(params[:id])

   respond_to do |format|
      if @recipe.update_attributes(params[:recipe])
         flash[:notice] = 'Recipe was successfully updated.'
         format.html { redirect_to(@recipe) }
         format.xml  { head :ok }
      else
         format.html { render :action => "edit" }
         format.xml  { render :xml => @recipe.errors, 
                      :status => :unprocessable_entity }
      end

   end

   # DELETE /recipes/1
   # DELETE /recipes/1.xml
   def destroy
      @recipe = Recipe.find(params[:id])
      @recipe.destroy
      
      respond_to do |format|
         format.html { redirect_to(recipes_url) }
         format.xml  { head :ok }
      end
   end
end

Tệp này có tất cả các phương pháp được triển khai tự động. Bạn có thể thực hiện bất kỳ thao tác Tạo, Đọc, Xóa hoặc Chỉnh sửa nào bằng các phương pháp khả dụng này.

Khi người dùng ứng dụng Rails chọn một hành động, ví dụ: "Show" - bộ điều khiển sẽ thực thi bất kỳ mã nào trong phần thích hợp - "def show" - và sau đó theo mặc định sẽ hiển thị một mẫu có cùng tên - "show.html .erb ”. Hành vi mặc định này có thể được ghi đè bằng cách ghi đè mã trong bất kỳ mẫu nào. -

Bộ điều khiển sử dụng các phương thức ActiveRecord như find, find_all, new, save, update_attributes, và hủy để di chuyển dữ liệu đến và từ các bảng cơ sở dữ liệu. Lưu ý rằng bạn không phải viết bất kỳ câu lệnh SQL nào, Rails sẽ tự động xử lý nó.

Quan điểm

Tất cả các khung nhìn và phương thức bộ điều khiển tương ứng được tạo bởi scaffoldvà chúng có sẵn trong thư mục ứng dụng / lượt xem / công thức nấu ăn. Bạn sẽ có các tệp sau trong thư mục này -

  • index.html.erb - Đây là tệp mẫu để hiển thị trang mặc định và sẽ được thực thi khi bạn gõ http://127.0.0.1:3000/recipes.

  • new.html.erb - Đây là mẫu để tạo một công thức mới và sẽ được thực thi bất cứ khi nào bạn cố gắng tạo một công thức mới.

  • show.html.erb - Đây là mẫu để hiển thị tất cả các công thức trong cơ sở dữ liệu của bạn và sẽ được thực thi bất cứ khi nào bạn cố gắng xem tất cả các công thức.

  • edit.html.erb - Đây là mẫu để chỉnh sửa bất kỳ công thức nào trong cơ sở dữ liệu của bạn và sẽ được thực thi bất cứ khi nào bạn cố gắng chỉnh sửa bất kỳ công thức nào.

Chúng tôi khuyên bạn nên mở từng tệp một và cố gắng hiểu mã nguồn của chúng.

Cuộc di cư

Bạn sẽ tìm thấy một tệp di chuyển được tạo trong ~/cookbook/db/migratethư mục con. Tập tin này sẽ có nội dung sau:

class CreateRecipes < ActiveRecord::Migration
   def self.up
      create_table :recipes do |t|
         t.string :title
         t.string :chef
         t.text :instructions
         t.timestamps
      end
   end

   def self.down
      drop_table :recipes
   end
end

Để tạo tệp cần thiết trong cơ sở dữ liệu của bạn, hãy sử dụng tập lệnh trợ giúp như sau.

cookbook> rake db:migrate

Lệnh này sẽ tạo recipesschema_migrations bảng của bạn cookbookcơ sở dữ liệu. Trước khi tiếp tục, hãy đảm bảo rằng bạn đã tạo thành công bảng yêu cầu trong cơ sở dữ liệu của mình.

Sẵn sàng kiểm tra

Tất cả các bước trên làm cho bảng cơ sở dữ liệu của bạn trở nên sống động. Nó cung cấp một giao diện đơn giản cho dữ liệu của bạn và các cách -

  • Tạo mục nhập mới
  • Chỉnh sửa các mục nhập hiện tại
  • Xem các mục nhập hiện tại
  • Hủy mục nhập hiện tại

Khi tạo hoặc chỉnh sửa một mục nhập, giàn giáo sẽ thực hiện tất cả công việc khó khăn của việc tạo và xử lý biểu mẫu. Nó thậm chí sẽ cung cấp tạo biểu mẫu thông minh, hỗ trợ các loại đầu vào sau:

  • Chuỗi văn bản đơn giản
  • Vùng văn bản (hoặc khối văn bản lớn)
  • Bộ chọn ngày
  • Bộ chọn ngày giờ

Bây giờ, hãy vào thư mục cookbook và chạy Máy chủ Web bằng lệnh sau:

cookbook> ruby script/server

Bây giờ, hãy mở trình duyệt và điều hướng đến http://127.0.0.1:3000/recipes/new. Nó sẽ cung cấp cho bạn một màn hình để tạo các mục mới trong bảng công thức nấu ăn. Ảnh chụp màn hình được hiển thị bên dưới -

Bây giờ, hãy nhập một số giá trị vào các hộp văn bản đã cho và nhấn nút Tạo để tạo một công thức mới. Hồ sơ của bạn được thêm vào bảng công thức nấu ăn và nó hiển thị kết quả sau:

Bạn có thể sử dụng Edit tùy chọn để chỉnh sửa công thức hoặc Backđể chuyển đến trang trước. Giả sử bạn đã nhấnBack, nó sẽ hiển thị tất cả các công thức nấu ăn có sẵn trong cơ sở dữ liệu của bạn. Vì chúng tôi chỉ có một bản ghi trong cơ sở dữ liệu của mình, nó sẽ hiển thị cho bạn màn hình sau:

Màn hình này cung cấp cho bạn tùy chọn để xem chi tiết đầy đủ của bảng công thức. Ngoài ra, nó cung cấp các tùy chọn để chỉnh sửa hoặc thậm chí xóa bảng.

Nâng cao mô hình

Rails cung cấp cho bạn rất nhiều lỗi xử lý miễn phí. Để hiểu điều này, hãy thêm một số quy tắc xác thực vào mô hình công thức trống -

Sửa đổi ~/cookbook/app/models/recipe.rb như sau và sau đó kiểm tra ứng dụng của bạn -

class Recipe < ActiveRecord::Base
   validates_length_of :title, :within => 1..20
   validates_uniqueness_of :title, :message => "already exists"
end

Các mục này sẽ tự động kiểm tra, chẳng hạn như -

  • validates_length_of - Trường không trống và không quá dài.

  • validates_uniqueness_of- Các giá trị trùng lặp bị mắc kẹt. Thay vì thông báo lỗi Rails mặc định, chúng tôi đã đưa ra thông báo tùy chỉnh của mình.

Ở đây chúng tôi đang cố gắng cung cấp một tiêu đề lớn hơn trong khi chỉnh sửa bản ghi đang thoát. Nó tạo ra thông báo lỗi sau, chỉ vì chúng tôi đã thêm các xác thực ở trên -

Giàn giáo khác nhau như thế nào?

Nếu bạn đã xem qua các chương trước, thì bạn hẳn đã thấy rằng chúng tôi đã tạo ra các phương thức để liệt kê, hiển thị, xóa và tạo dữ liệu, nhưng giàn giáo thực hiện công việc đó một cách tự động.