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