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 recipes và schema_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.