PDF

Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với
Sinatra và MongoDB
Joe Lennon
Nhà phát triển phần mềm
Core International
19 01 2015
Tạo ứng dụng đăng ký hội thảo Sinatra được hỗ trợ bởi dịch vụ MongoDB trên IBM Bluemix.
Ứng dụng hiển thị dòng Tweet chứa hashtag hội nghị. Theo cách này, bạn sẽ sử dụng Haml cho
màn hình của ứng dụng và Chương trình khởi động cho giao diện người dùng. Sử dụng Bluemix
giúp mở rộng ứng dụng này dễ dàng— bầu trời mới là giới hạn thật sự.
Để xem video giới thiệu Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB , vui lòng truy cập bài viết trực tuyến.
Nếu bạn đã từng tham dự hội nghị, có lẽ bạn đã nhận thấy khó xác định có ai ở đó, và họ ở đâu tại
thời điểm bất kỳ nào đó. Trong hướng dẫn này, bạn sẽ tìm hiểu cách tạo ứng dụng cho phép người
dùng đăng ký tại hội thảo, vì thế những người tham dự có thể biết ai đã đăng ký và địa điểm họ đã
đăng ký. Ứng dụng cũng hiển thị dòng Tweet chứa hashtag hội nghị.
Để tạo ứng dụng, chúng ta sẽ sử dụng Ruby và Sinatra, khung web nhẹ cho phép bạn tạo nhanh
ứng dụng. Chúng ta sẽ sử dụng Haml cho màn hình của ứng dụng, Chương trình khởi động cho giao
diện người dùng, và tất cả dữ liệu sẽ được lưu trữ trong cơ sở dữ liệu MongoDB. Chúng ta sẽ triển
khai sản phẩm cuối cùng trên nền tảng IBM Bluemix, giúp bạn dễ dàng đặt mã vào sản xuất mà
không phải lo về việc quản lý máy chủ và cơ sở dữ liệu.
Chạy ứng dụng
Nhận mã tại JazzHub
Những điều cần có để tạo ứng dụng
•
•
•
•
•
Hiểu biết cơ bản về Ruby và môi trường phát triển Ruby
Cài đặt cục bộ MongoDB
Tài khoản Bluemix.
Giao diện dòng lệnh Bluemix, cf
Tài khoản Twitter để truy cập API
Để ngắn gọn, hướng dẫn này không bao gồm danh sách mã nguồn đầy đủ, nhưng bạn có thể tải
xuống mã nguồn hoàn chỉnh cho ứng dụng trên JazzHub. Phải chắc chắn tải xuống mã để bạn có
thể theo dõi cùng với hướng dẫn.
© Copyright IBM Corporation 2015
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Nhẫn hiệu đăng ký
Trang 1 của 15
developerWorks®
ibm.com/developerWorks/vn/
Bước 1. Tạo ứng dụng
Trước tiên và quan trọng nhất, hãy thiết lập ứng dụng Sinatra và chạy. Với Ruby đã cài đặt, việc này
rất đơn giản. Thay vì cài đặt tất cả gem cần thiết để tạo ứng dụng, chúng ta sẽ sử dụng bundler để
quản lý các phụ thuộc. Nếu bạn chưa cài đặt bundler, bạn có thể làm như vậy bằng cách sử dụng
lệnh sau:
gem install bundler
Nếu bạn sử dụng nền tảng UNIX®, bạn có thể cần sử dụng sudo khi cài đặt gem này.
Với bundler đã cài đặt, chúng ta có thể bắt đầu tạo ứng dụng. Tạo thư mục dự án mới cho ứng
dụng, và trong thư mục này tạo tập tin mới có tên Gemfile. Việc này sẽ xác định tất cả phụ thuộc
cho ứng dụng. Thêm mã sau vào tập tin này.
source 'https://rubygems.org'
gem 'sinatra', '>= 0'
gem 'haml', '>= 0'
gem 'json', '>=0'
gem 'mongo', '>=0'
gem 'bson', '>=0'
gem 'bson_ext', '>=0'
gem 'actionview', '>=0'
gem 'twitter', '>=0'
Tại dòng lệnh, điều hướng đến thư mục dự án và chạy:
bundle install
Việc này cài đặt các phụ thuộc được liệt kê trong Gemfile. Có thể bạn sẽ được yêu cầu nhập mật
khẩu khi chạy lệnh này, phụ thuộc vào hệ vận hành của bạn. Tiếp theo, hãy thiết lập ứng dụng
Sinatra và chạy. Tạo tập tin mới có tên app.rb và thêm mã sau đây vào tập tin.
require "sinatra"
get "/" do
"Hello, world!"
end
Cuối cùng, tạo tập tin có tên config.ru. Nội dung của nó là:
require './app'
run Sinatra::Application
Bây giờ bạn có thể chạy ứng dụng. Tại dòng lệnh, trong thư mục dự án, hãy chạy lệnh sau đây:
rackup -p 4567
Lệnh này chạy máy chủ web trên máy của bạn trên cổng 4567. Để xem ứng dụng hoạt động, hướng
trình duyệt của bạn đến http://localhost:4567. Bạn sẽ thấy màn hình như vậy:
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 2 của 15
ibm.com/developerWorks/vn/
developerWorks®
Bước 2. Nhúng ứngng dụng vào Bluemix
Để sử dụng Bluemix, bạn sẽ cần cài đặt cf công cụ giao diện dòng lệnh. Nếu bạn chưa có, hãy đến
trang GitHub của dự án (https://github.com/cloudfoundry/cli) để được hướng dẫn tải xuống. Ngoài
ra, bạn có thể tạo ứng dụng và dịch vụ từ bảng điều khiển Bluemix, nhưng bạn sẽ cần cf để triển
khai ứng dụng của bạn, vì vậy chúng ta sẽ sử dụng nó để làm mọi việc trong hướng dẫn này.
Để kết nối với Bluemix API và đăng nhập vào tài khoản Bluemix, hãy chạy các lệnh sau:
cf api https://api.ng.bluemix.net
cf login
Bạn sẽ cần cung cấp địa chỉ email và mật khẩu sau khi nhập lệnh thứ hai.
Cảnh báo: Phải chắc chắn nhập máy chủ và tên duy nhất cho ứng dụng của bạn khi triển khai sang
Bluemix. Nếu bạn sử dụng tên tôi đã cung cấp trong các ví dụ bạn sẽ gặp lỗi.
Tiếp theo, tạo tập tin mới tại gốc dự án có tên manifest.yml. Tập tin này cho Bluemix biết bạn muốn
triển khai ứng dụng như thế nào. Thêm mã sau đây cho tập tin, nhưng hãy chắc chắn đổi tên máy
chủ thành tên duy nhất hoặc sẽ thất bại.
applications:
- name: myconf2014
host: myconf2014
disk: 1024M
path: .
domain: ng.bluemix.net
mem: 128M
instances: 1
Bây giờ bạn có thể triển khai ứng dụng này trên Bluemix khi sử dụng lệnh sau đây:
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 3 của 15
developerWorks®
ibm.com/developerWorks/vn/
cf push myconf2014
Khi ứng dụng đã triển khai, bạn sẽ thấy thông báo rằng ứng dụng đã bắt đầu và URL của ứng dụng
là gì. Tải URL này, http://myconf2014.ng.bluemix.net, vào trình duyệt của bạn để kiểm tra rằng nó
đang hoạt động.
Trong khi tải, bạn hãy tiến hành tạo dịch vụ MongoDB:
cf create-service mongodb 100 myconf2014db
Phải chắc chắn thay đổi tên cơ sở dữ liệu (myconf2014db ở trên) thành tên duy nhất. Để ứng dụng có
thể kết nối với cơ sở dữ liệu, chúng ta cần kết nối nó:
cf bind-service myconf2014 myconf2014db
Bạn cần khởi động lại ứng dụng để kết nối hoạt động. Không cần thực hiện điều này ngay bây giờ
vì chúng ta sẽ sớm nhúng một số thay đổi. Tiếp theo, hãy thiết lập ứng dụng cùng với truy cập vào
Twitter API.
Bước 3. Truy cập Twitter API
Khối hợp nhất cuối cùng bạn sẽ cần để bắt đầu thực hiện ứng dụng là truy cập vào Twitter API. Đi
đến https://dev.twitter.com/, đăng nhập và tạo ứng dụng mới. Sau đó, điều hướng đến trang của ứng
dụng và bạn sẽ tìm thấy khóa API và bảo mật. Ở cuối trang sẽ có nút tạo thẻ xác thực truy cập - hãy
nhấp vào đây. Sau một phút, bạn có thể làm mới trang và nhìn thấy thẻ xác thực truy cập và bảo
mật thẻ xác thực truy cập của bạn.
Để kết nối với API từ ứng dụng, chúng ta sẽ sử dụng biến môi trường. Phương pháp tốt nhất yêu cầu
bạn không nên lưu trữ bảo mật, khóa, và mật khẩu bằng mã của bạn, thay vì vậy hãy tiếp tục thêm
các biến môi trường. Bạn sẽ cần tạo bốn biến môi trường:
•
•
•
•
TWITTER_CONSUMER_KEY
TWITTER_CONSUMER_SECRET
TWITTER_ACCESS_TOKEN
TWITTER_ACCESS_TOKEN_SECRET
Đặt giá trị của các biến này làm giá trị được liệt kê trên trang ứng dụng Twitter của bạn. Trên
Windows®, bạn có thể cài đặt các giá trị này từ phần "Hệ thống" trong Bảng điều khiển. Trên Mac
OS X và Linux®, bạn thường thêm các giá trị này cho .bashrc hoặc tập lệnh khởi động tương tự sử
dụng lệnh export.
Bạn cũng cần cài đặt các biến môi trường này trên Bluemix nên chúng được chọn khi ứng dụng
được triển khai tại đó. Để thực hiện việc này, hãy sử dụng lệnh cf set-env như dưới đây:
cf set-env [appname] [key] [value]
Ví dụ, nếu tên ứng dụng của bạn là myconf2014 và Khóa người sử dụng Twitter của bạn là
abcdefghijklmnopqrstuvwxyz, bạn sẽ sử dụng lệnh:
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 4 của 15
ibm.com/developerWorks/vn/
developerWorks®
cf set-env myconf2014 TWITTER_CONSUMER_KEY abcdefghijklmnopqrstuvwxyz
Phải chắc chắn lặp lại quy trình cho mỗi bốn biến được liệt kê ở trên. Với thiết lập truy cập Twitter,
chúng ta sẵn sàng bắt đầu lập mã.
Bước 4. Khởi động ứng dụng đăng ký hội nghị
Bây giờ chúng ta đã hoàn tất công việc lập cấu hình cơ bản, chúng ta có thể tiếp tục tạo ứng dụng.
Để bắt đầu, chúng ta thêm các thư mục phụ và khối cấu hình vào tập tin ứng dụng chính, app.rb.
...
configure :production do
# Get the credentials for the MongoDB Bluemix service
env = JSON.parse(ENV["VCAP_SERVICES"])["mongodb-2.2"].first["credentials"]
# Connect to MongoDB and authenticate using environment variables
conn = MongoClient.new(env["hostname"], env["port"])
db = conn.db(env["db"])
db.authenticate(env["username"], env["password"])
# Store the DB connection in a setting for easy later retrieval
set :db, db
end
Mã này xác nhận các thư mục phụ của ứng dụng và bao gồm khối configure thiết lập kết nối
MongoDB cho sản xuất. Trên Bluemix, cài đặt dịch vụ được lưu trữ trong biến môi trường có tên
VCAP_SERVICES— chúng ta đọc cài đặt kết nối cho dịch vụ MongoDB sản xuất từ đây. Tiếp theo,
chúng ta sẽ thêm khối tương tự vào tập tin app.rb, nhưng dành cho phát triển cục bộ. Mã này là:
...
configure :development do
conn = MongoClient.new("localhost", 27017)
db = conn.db("myconf2014")
set :db, db
end
Mã này chỉ yêu cầu ứng dụng kết nối với cơ sở dữ liệu MongoDB cục bộ khi chạy trong chế độ phát
triển. Khi chúng ta chạy ứng dụng cục bộ sử dụng rackup, nó sẽ chạy bằng cách này theo mặc định.
Khối cấu hình cuối cùng sẽ chạy cho cả sản xuất và phát triển. Đoạn của mã này là:
...
configure do
# Get Mongo collections
locations = settings.db.collection("locations")
checkins = settings.db.collection("checkins")
tweets = settings.db.collection("tweets")
if locations.count < 1
baseLocations = [
{"name" => "Main Pavilion", "slug" => "main-pavilion"},
...
{"name" => "Western Zone 2", "slug" => "west-2"}
]
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 5 của 15
developerWorks®
ibm.com/developerWorks/vn/
locations.insert(baseLocations)
end
# Connect to Twitter API
twitter = Twitter::REST::Client.new do |config|
config.consumer_key = ENV["TWITTER_CONSUMER_KEY"]
config.consumer_secret = ENV["TWITTER_CONSUMER_SECRET"]
config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
end
set
set
set
set
end
:locations, locations
:checkins, checkins
:tweets, tweets
:twitter, twitter
Dữ liệu cho ứng dụng sẽ được lưu trữ trong ba tập hợp MongoDB: locations, checkins vàtweet.
Nếu không có địa điểm trong cơ sở dữ liệu (như trong lần chạy đầu tiên của chúng ta), chúng ta sẽ
thêm một số địa điểm mới. Khối này cũng thiết lập kết nối đến Twitter API, đọc các đặc tính cần
thiết khác nhau từ biến môi trường mà chúng ta đã thiết lập trước đó.
Cuối cùng, chúng ta thêm tham chiếu cho mỗi tập hợp trong đối tượng settings, sẽ khả dụng từ tất
cả định tuyến của ứng dụng. Tiếp theo, hãy xác định định tuyến đầu tiên của chúng ta. Trang chủ
của ứng dụng sẽ liệt kê một số hoạt động gần đây, vì vậy chúng ta cần tìm nạp các đăng ký gần đây
nhất từ cơ sở dữ liệu. Định nghĩa về gốc hoặc định tuyến chỉ mục '/' là:
get '/' do
# Get 10 most recent checkins
checkins = settings.checkins.find.sort(:timestamp => :desc).limit(10).to_a
checkins.each do |checkin|
# Get location details for the checkin
checkin['location'] = settings.locations.find_one(:_id => checkin['location_id'])
end
haml :index, :locals => {:checkins => checkins}
end
Mã này sẽ tìm thấy mười đăng ký mới nhất trong cơ sở dữ liệu. Với mỗi đăng ký, nó sẽ tìm địa điểm
theo ID và đính kèm nhiều chi tiết địa điểm cho đối tượng checkin. Cuối cùng, nó sẽ trả về màn
hình Haml có tên index, thông qua các đăng ký như biến cục bộ. Theo mặc định, Sinatra sẽ tìm
kiếm màn hình này trong thư mục con của màn hình trong dự án của bạn, và nó sẽ yêu cầu màn
hình được đặt tên là index.haml.
Trong ứng dụng của bạn, chúng ta sẽ sử dụng bố cục và thanh điều hướng chung. Thay vì lặp lại mã
này trong mỗi màn hình, chúng ta có thể thêm mã vào tập tin có tên layout.haml, và nó sẽ được
chọn bởi tất cả màn hình của ứng dụng. Tập tin bố cục này bao gồm khung Chương trình khởi động
CSS để tạo kiểu và thư viện jQuery JavaScript, cần thiết cho một số plug-in của Chương trình khởi
động. Bố cục xác định thanh điều hướng chung hiển thị trong tất cả trang trong ứng dụng. Nội dung
của màn hình Haml sẽ được bổ sung bên trong bố cục này, thay thế dòng =yield hướng về cuối
mẫu.
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 6 của 15
ibm.com/developerWorks/vn/
developerWorks®
Tiếp theo, chúng ta tạo màn hình index.haml. Màn hình này hiển thị thông báo jumbotron lớn với
nút liên kết đến trang Đăng ký, và Dòng hoạt động hiển thị mười đăng ký gần đây nhất. Đoạn mã
màn hình là:
...
- checkins.each do |checkin|
%li.list-group-item
.row
.col-sm-6
%a{:href => checkin['twitter_url']}
%img{:src => checkin['twitter_pic']}>
%a{:href => checkin['twitter_url']}
%strong> @#{checkin['twitter_username']}
checked in at
%a{:href => url("/location/#{checkin['location']['slug']}")}= checkin['location']['name']
.col-sm-6.text-right.text-muted
%em #{time_ago_in_words(checkin['timestamp'])} ago
...
Trong mã này, chúng ta lặp lại biến checkins đã thông qua khi chúng ta tạo / định tuyến trước đó,
và thêm mục danh sách cho mỗi đăng ký. Nếu không có đăng ký để hiển thị, thông báo và liên kết
đến "hãy đăng ký đầu tiên" sẽ hiển thị thay thế.
Giờ bạn có thể chạy ứng dụng cục bộ. Trước khi khởi động máy chủ web, bạn phải chắc chắn
MongoDB đang chạy. Thông thường, bạn có thể thực hiện việc này bằng cách sử dụng lệnh mongod.
Ghi chú: Với một vài thay đổi hoặc không thay đổi, ứng dụng có thể sử dụng Cloudant thay vì
Mongo và nhận QoS tốt hơn.
Mẹo: Nếu bạn nhận thông báo lỗi rằng dbpath của bạn không tồn tại khi bạn thử khởi động
MongoDB, hãy tạo thư mục và khởi động mongod với cờ --dbpath được đặt là đường dẫn của thư
mục này.
Để bắt đầu máy chủ web từ dấu nhắc lệnh, hãy ra lệnh sau:
rackup -p 4567
Hướng trình duyệt của bạn đến http://localhost:4567 để xem ứng dụng hoạt động.
Ghi chú: Khi làm việc với Sinatra, có thể xem các thay đổi bất kỳ về màn hình bằng cách làm mới
cửa sổ trình duyệt. Nếu bạn thay đổi mã nguồn Ruby (ví dụ, trong app.rb), tuy nhiên, bạn sẽ cần hủy
quy trình Rack và khởi động lại để xem thay đổi.
Nếu bạn chạy lệnh cf push tại dòng lệnh để triển khai ứng dụng của bạn đến Bluemix và xem nó
trong trình duyệt của bạn, bạn nên xem kết quả tương tự với:
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 7 của 15
developerWorks®
ibm.com/developerWorks/vn/
Tiếp theo, hãy thiết lập trang địa điểm và chạy.
Bước 5. Tạo trang địa điểm
Khi người dùng nhấp vào liên kết "Locations" trong thanh điều hướng của ứng dụng, chúng ta muốn
họ nhìn thấy danh sách các địa điểm sẵn có tại hội nghị, cùng với số lượng người đã đăng ký cho
địa điểm đó.
Bước đầu tiên để thêm chức năng này là tạo định tuyến mới, '/location'. Mã định tuyến này là:
...
get '/location' do
# Get all locations
locations = settings.locations.find.sort(:name).to_a
locations.each do |location|
# Get checkins for the location
location['checkins'] = settings.checkins.find("location_id" => location["_id"]).to_a
end
haml :locations, :locals => {:locations => locations}
end
Mã này nhận tất cả địa điểm từ cơ sở dữ liệu MongoDB, và nhận đăng ký bất kỳ đã được thực hiện
tại địa điểm đó. Sau đó nó tải màn hình Haml, locations.haml.
...
- locations.each do |location|
%a.list-group-item{:href => url("/location/#{location['slug']}")}
%span.badge= location['checkins'] ? location['checkins'].length : '0'
%i.fa.fa-fw.fa-map-marker
= location['name']
...
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 8 của 15
ibm.com/developerWorks/vn/
developerWorks®
Trang này chỉ hiển thị danh sách địa điểm đã được chuyển đến màn hình. Mỗi địa điểm được trình
bày dưới dạng mục danh sách, với bộ thẻ cho biết có bao nhiêu người được đăng ký cho địa điểm
đó.
Khi người dùng nhấp vào địa điểm trên trang này, chúng ta muốn hiển thị trang cho biết tất cả
người tham dự đã đăng ký cho địa điểm đó. Để thực hiện việc này, chúng ta cần thêm định tuyến
khác cho app.rb.
get '/location/:slug' do |s|
# Lookup location by its URL slug
location = settings.locations.find_one("slug" => s)
# Get checkins for the location
checkins = settings.checkins.find("location_id" => location["_id"]).sort(:timestamp => :desc).to_a
haml :location, :locals => {:location => location, :checkins => checkins}
end
Trong định tuyến này, chúng ta sẽ chấp nhận tham số trong URL— đây là slug cho địa điểm. Chúng
ta có thể sử dụng slug này để tìm tập hợp địa điểm trong cơ sở dữ liệu. Sau đó chúng ta tìm tất cả
đăng ký cho địa điểm trong câu hỏi và chuyển các đăng ký cho màn hình location.haml.
...
- checkins.each do |checkin|
.col-xs-6.col-sm-3.col-md-2
.checkin
%a{:href => checkin['twitter_url']}
%img{:src => checkin['twitter_pic']}
%strong> @#{checkin['twitter_username']}
%br
%em.small #{time_ago_in_words(checkin['timestamp'])} ago
...
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 9 của 15
developerWorks®
ibm.com/developerWorks/vn/
Trang này sẽ lặp lại đăng ký cho địa điểm đã chọn, và sẽ hiển thị hình đại diện Twitter của người
dùng, tên người dùng Twitter của họ và thời điểm họ đăng ký. Nó cũng sẽ hiển thị số lượng người
được đăng ký.
Nếu bạn chạy ứng dụng bây giờ, bạn có thể điều hướng đến trang “Địa điểm” và xem danh sách các
địa điểm, và nhấp vào địa điểm bất kỳ để xem trang của địa điểm đó. Ngay lúc này sẽ không hiển
thị các đăng ký— chúng ta sẽ điều chỉnh việc đó tiếp theo bằng cách tạo biểu mẫu cho phép người
dùng đăng ký cho địa điểm.
Bước 6. Cho phép người dùng đăng ký
Cho đến lúc này ứng dụng của chúng ta hầu như là chỉ đọc. Đã đến lúc cung cấp cho người dùng
cách thức đăng ký cho ứng dụng. Trước tiên, chúng ta sẽ tạo định tuyến cho trang biểu mẫu đăng
ký.
get '/checkin' do
# Get a list of locations for the dropdown
locations = settings.locations.find.sort(:name).to_a
haml :checkin, :locals => {:locations => locations, :error => params[:error]}
end
Định tuyến này rất đơn giản— nó nhận danh sách các địa điểm và chuyển chúng đến màn hình
checkin.haml. Màn hình này hiển thị biểu mẫu cho người dùng. Nó có hai trường: ô văn bản cho
tên sử dụng Twitter của người dùng, và danh sách thả xuống với các địa điểm sẵn có. Danh sách
gồm các địa điểm mà chúng ta đã đưa vào từ định tuyến.
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 10 của 15
ibm.com/developerWorks/vn/
developerWorks®
Thuộc tính action của biểu mẫu được đặt là URL /checkin. Khi người dùng gửi biểu mẫu, nó sẽ
truyền dữ liệu vào hàm yêu cầu POST cho URL này. Để xử lý việc này, chúng ta cần tạo định tuyến
khác.
...
post '/checkin' do
...
# Check if user has checked in before
checkin = settings.checkins.find_one(:twitter_username => username)
if(checkin)
# Update existing checkin
checkin['location_id'] = BSON::ObjectId(location_id)
checkin['timestamp'] = Time.now
settings.checkins.update({"_id" => checkin["_id"]}, checkin)
else
# Insert new checkin
checkin = {
:twitter_username => username,
...
:timestamp => Time.now
}
settings.checkins.insert(checkin)
end
# Get location details
location = settings.locations.find_one(:_id => BSON::ObjectId(location_id))
# Redirect to location page
redirect "/location/#{location['slug']}"
...
end
Mã này sẽ nhận tên sử dụng Twitter và địa điểm đã chọn từ biểu mẫu và sử dụng nó để đăng ký
người dùng. Trước tiên nó sẽ tìm thấy người dùng trên Twitter— nếu người dùng không tồn tại, nó
sẽ trả về lỗi và chuyển hướng quay lại biểu mẫu đăng ký. Sau đó nó xác định người dùng đã đăng
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 11 của 15
developerWorks®
ibm.com/developerWorks/vn/
ký trước đó hay chưa. Nếu đã đăng ký, nó sẽ thực hiện cập nhật tài liệu hiện hành trong cơ sở dữ
liệu, nhưng nếu không, nó sẽ chèn tài liệu mới.
Ghi chú: Nếu bạn đang xem xét triển khai ứng dụng như vậy khi đang sử dụng, bạn nên thực hiện
xác thực Oauth của Twitter để xác thực rằng người dùng sở hữu tài khoản Twitter mà họ đang sử
dụng để đăng ký. Để ngắn gọn, tôi đã không trình bày khái niệm này trong hướng dẫn.
Sau khi cập nhật cơ sở dữ liệu, ứng dụng chuyển hướng người dùng đến trang địa điểm cho địa điểm
đã chọn, nơi người dùng sẽ nhìn thấy đăng ký của họ, cũng như các người dùng khác đã đăng ký
cho địa điểm đó.
Bây giờ người dùng có thể đăng ký cho địa điểm bất kỳ. Bạn sẽ nhận thấy rằng trang chủ lúc này
sẽ hiển thị các đăng ký gần đây từ tất cả địa điểm trên Dòng hoạt động. Chức năng chính cho ứng
dụng giờ đã hoàn tất. Để hoàn tất, hãy tạo trang "Tweet", trang sẽ hiển thị mười tweet gần đây nhất
với hash tag của hội nghị, #myconf2014.
Bước 7. Xem tweet với hashtag hội nghị
Làm việc với Twitter API tương đối đơn giản, đặc biệt là sử dụng gem twitter trong Ruby. Tuy nhiên,
một điều bạn cần cẩn thận, đó là Twitter có giới hạn tốc độ khá thấp ở hầu hết API của nó— đặc
biệt là các API truy xuất tweet và thông tin người dùng. Để tránh gặp phải những giới hạn này, bạn
cần xem xét chiến lược của mình để thực hiện API.
Tại thời điểm ghi, API tìm kiếm có giới hạn tốc độ là 180 yêu cầu mỗi giờ cho mỗi người dùng được
xác thực (450 cho mỗi ứng dụng). Đây có vẻ là con số hợp lý, nhưng hãy tưởng tượng mỗi khi ai đó
truy cập trang của bạn, bạn cần thực hiện yêu cầu API. Bạn sẽ gặp giới hạn tốc độ khá nhanh, một
khi gặp phải, bạn thường bị cấm sử dụng lại nó trong 15 phút. Những người phạm lỗi nhiều lần có
thể bị cấm sử dụng API hoàn toàn.
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 12 của 15
ibm.com/developerWorks/vn/
developerWorks®
Cách tốt nhất để giảm thiểu vấn đề này là lưu trữ tweet trong cơ sở dữ liệu riêng của bạn, và chúng
ta sẽ thực hiện điều đó trong ví dụ này. Thay vì truy vấn API mỗi khi người dùng ghé thăm trang
"Tweet", chúng ta sẽ kiểm tra xem tweet đã được lưu trữ trong cơ sở dữ liệu hay chưa. Nếu chưa,
hoặc nếu lần cuối cùng chúng ta lưu trữ tweet là cách đây hơn năm phút, chúng ta sẽ yêu cầu tweet
mới từ API, và lưu tweet vào cơ sở dữ liệu.
Trước tiên, chúng ta cần định tuyến/tweet mới trong app.rb.
...
get '/tweets' do
# Get one tweet from the database to check if we need to fetch new tweets
tweet = settings.tweets.find_one
tweet ? minutes = (Time.now - tweet['retrieved_at']).to_i / 60 : 0
if(!tweet || minutes > 5)
# Get new tweets
newTweets = settings.twitter.search("#myconf2014", :result_type => "recent").take(10).to_a
# Remove cached tweets from DB
settings.tweets.remove
newTweets.each do |t|
tweet = {
:twitter_username => t.user.screen_name,
...
:retrieved_at => Time.now
}
# Cache each tweet into DB
settings.tweets.insert(tweet)
end
# Reset minutes since last updated to zero
minutes = 0
end
# Get tweets from DB
tweets = settings.tweets.find.sort(:tweet_time => :desc).limit(10).to_a
haml :tweets, :locals => {:tweets => tweets, :updated => minutes}
end
Mã này nhận một tweet từ cơ sở dữ liệu và kiểm tra bao nhiêu phút đã trôi qua từ khi tweet được
truy xuất. Nếu không tìm thấy tweet hoặc hơn 5 phút đã trôi qua, mã sẽ tìm Twitter cho tweet mới,
xóa tweet cũ khỏi cơ sở dữ liệu, và lưu tweet mới. Sau đó nó tìm kiếm 10 tweet gần đây nhất từ
cơ sở dữ liệu và chuyển các tweet này đến màn hình tweets.haml. Màn hình này cho biết khoảng
thời gian từ khi tweet được truy xuất lần cuối là bao lâu, cũng như bảng tweet. Mẫu lặp lại qua mỗi
tweet, hiển thị hình đại diện, tên đại diện, tên thật, văn bản tweet của người dùng, và khoảng thời
gian từ khi đăng tweet là bao lâu. Trang sẽ trông như vậy.
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 13 của 15
developerWorks®
ibm.com/developerWorks/vn/
Bây giờ ứng dụng đã hoàn tất. Phải chắc chắn nhúng các thay đổi vào Bluemix bằng lệnh sau:
cf push
Xin chúc mừng, bạn đã tạo ứng dụng đăng ký hội thảo bằng Ruby, Sinatra, Haml, Bootstrap, và
MongoDB, và triển khai ứng dụng cho nền tảng Bluemix của IBM!
Kết luận
Ứng dụng bạn vừa tạo là ứng dụng Sinatra hoàn chỉnh được hỗ trợ bởi dịch vụ MongoDB trên
Bluemix. Đây là điểm khởi đầu tuyệt vời, nhưng có nhiều cách để cải thiện ứng dụng. Đối với những
người bắt đầu, có lẽ bạn muốn thực hiện xác thực Twitter để người dùng cần đăng nhập Twitter
trước khi đăng ký. Bạn cũng có thể cho phép người dùng đăng tweet trực tiếp từ ứng dụng, và hơn
thế nữa. Bluemix cung cấp một số dịch vụ cho phép bạn dễ dàng mở rộng ứng dụng này— bầu trời
mới là giới hạn thật sự.
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 14 của 15
ibm.com/developerWorks/vn/
developerWorks®
Đôi nét về tác giả
Joe Lennon
Joe Lennon là một nhà phát triển phần mềm 24 tuổi đến từ Cork, Ireland. Joe là tác
giả của cuốn sách Beginning CouchDB, (Khởi đầu với CouchDB) do Apress sắp xuất
bản, và đã đóng góp một số bài viết và hướng dẫn kỹ thuật cho developerWorks IBM.
Trong lúc rảnh rỗi, Joe thích chơi bóng đá (soccer), lang thang với các tiện ích, và làm
việc trên gamerscore Xbox 360 của mình. Có thể liên hệ với ông qua trang Web của
ông tại địa chỉ www.joelennon.ie
© Copyright IBM Corporation 2015
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
Tạo ứng dụng đăng ký hội thảo trên IBM Bluemix với Sinatra và
MongoDB
Trang 15 của 15