Trong phần này chúng ta sẽ tìm hiểu cách tạo một project Rails.
Tạo project
Để tạo project thì bạn mở Command Prompt (cmd) lên rồi dùng lệnh cd
để chuyển đến thư mục mà bạn muốn tạo, sau đó gõ lệnh rails new <tên project>
là được, ví dụ:
C:\Project\Rails>rails new Example create create READNE.rdoc create Rakefile create config.ru create .gitignore create Gemfile create app create app/assests/javascripts/application.js create app/assests/stylesheets/application.css create app/controllers/application_controller.rb create app/helpers/application_helper.rb ... ... run bundle install Fetching gem metadata from http://rubygems.org/......... Fetching version metadata from http://rubygems.org/........ Fetching dependency metadata from http://rubygems.org/........ Resolving dependencies...... Installing rake 11.3.0 ...
Lệnh rails new Example
sẽ tạo một thư mục có tên Example
và tạo các file với thư mục con cần thiết trong đó, đây là các file và thư mục của một project Rails.
Nếu bạn chạy lệnh mà báo lỗi “The system cannot find the file specified” thì bạn vào thư mục Ruby2.2.0/bin
trong thư mục cài đặt Rails, sau đó tìm trong tất cả các file có đuôi .bat
dòng này:
@"C:\Users\emachnic\GitRepos\railsinstaller-windows\stage\Ruby2.2.0\bin\ruby.exe"
Và thay bằng dòng này:
@"%~dp0ruby.exe"
Sau đó bạn chạy lại lệnh rails new
.
Ngoài ra còn có một lỗi khác cũng có thể xuất hiện, khi chạy lệnh rails new
, bạn để ý các dòng đầu tiên là create <tên file>
hoặc <tên thư mục>
, sau đó sẽ là dòng run bundle install
, dòng này có nghĩa là rails đang cài các thư viện cần thiết đi kèm, sau đó sẽ là các dòng Fetching
…. nhưng nếu của bạn không có các dòng này mà thay bằng các dòng tương tự như:
Fetching source index from https://rubygems.org/ Retrying fetcher due to error (2/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSAL certificate for https://rubygems.org/ There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'
Đây là các dòng thông báo lỗi, bạn có thể sửa bằng một cách thủ công vào mở toàn bộ file có tên Gemfile
(không có phần mở rộng) trong thư mục cài đặt Rails, rồi tìm dòng sources https://rubygems.org/
và đổi thành sources http://rubygems.org/
(bỏ kí tự ‘s’ sau ‘http’). Mặc dù cách này khá thủ công nhưng cách này chắc chắn 100% thành công.
Ngoài ra còn có một cách sửa khác nhưng sẽ không đảm bảo thành công ở thời điểm hiện tại, đó là bạn chạy lệnh gem update --system
để cập nhật phần mềm gem là được, (gem là phần mềm quản lý gói của Rails), tuy nhiên khi chạy lệnh này bạn có thể gặp lỗi sau:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Bạn có thể sửa bằng cách lên trang https://rubygems.org/pages/download tải phiên bản gem mới nhất về, sau đó giải nén, bạn sẽ được một thư mục chứa bộ mã nguồn cài đặt gem, trong đó có một file tên là setup.rb
, bạn mở Command Prompt lên trỏ đến thư mục đó (bằng lệnh cd
) rồi chạy lệnh ruby setup.rb --help
là xong.
Bây giờ bạn có thể chạy lại lệnh rails new để tạo project, tuy nhiên hiện tại một lần nữa nếu bạn vẫn còn thấy báo lỗi SSL thì lần này bạn chỉ còn có thể sửa bằng cách thay đổi đường dẫn https://rubygems.org/
thành http://rubygems.org/
như đã nói ở trên.
Chạy project
Trong thư mục của project có rất nhiều file, chúng ta sẽ tìm hiểu sau. Bây giờ để chạy một project thì bạn mở Command Prompt lên rồi chuyển đến thư mục đó, sau đó gõ lệnh rails server
là được:
C:\Project\Rails\Example>rails server => Booting WEBrick => Rails 4.2.5.1 application starting in development on http://localhost:3000 => Run 'rails server -h' for more startup options => Ctrl-C to shutdown server [2016-10-25 09:58:49] INFO WEBrick 1.3. [2016-10-25 09:58:49] INFO ruby 2.2.4 (2015-12-16) [i386-mingw32] [2016-10-25 09:58:49] INFO WEBrick::HTTPServer#start: pid=14844 port=3000
Mỗi project rails sẽ tự chạy một web server cho riêng nó, khác với các công nghệ như PHP, ASP.NET, Java… là bạn sẽ phải cài một webserver riêng như Apache, NginX hay IIS…
Chúng ta đã chạy một web server trên cổng 3000, bạn có thể mở trình duyệt và trỏ đến URL http://localhost:3000
hoặc http://127.0.0.1:3000
để xem thông báo của server.
Để tắt server thì bạn có thể dùng tổ hợp phím Ctrl+C hoặc đơn giản là tắt Command Prompt luôn 🙂
Tùy chỉnh project
Rails được xây dựng dựa trên mô hình MVC, về cơ bản thì khi chúng ta mở trình duyệt và nhập vào URL của server, thì trình duyệt sẽ gửi một yêu cầu HTTP đến server, server nhận được yêu cầu đó và sẽ gửi vào một Controller nào đó và gọi phương thức xử lý ở đó. Tiếp theo Controller sẽ gọi một View để trả về nội dung HTML cho trình duyệt. Chúng ta sẽ tìm hiểu thêm về kiến trúc này sau.
Bây giờ chúng ta sẽ tạo một Controller và một View mẫu và hiển thị dòng chữ Hello World.
Chúng ta mở một Command Prompt khác lên rồi chuyển đến thư mục của project, sau đó gõ lệnh rails generate controller
để tạo một controller, lệnh này có cú pháp như sau:
rails generate controller <tên controller> <tên route 1> <tên route 2>....<tên route n>
Ví dụ:
C:\Project\Rails\Example>rails generate controller Say hello goodbye create app/controllers/say_controller.rb route get 'say/goodbye' route get 'say/hello' invoke erb create app/views/say create app/views/say/hello.html.erb create app/views/say/goodbye.html.erb invoke test_unit create test/controllers/say_controller_test.rb invoke helper create app/helpers/say_helper.rb invoke test_unit invoke assets invoke coffee create app/assets/javascripts/say.coffee invoke scss create app/assets/stylesheets/say.scss
Ở đây chúng ta tạo một controller có tên là Say,
trong đó có 2 hàm route là hello
và goodbye.
Bạn có thể mở thư mục app\controllers
trong thư mục gốc của project là sẽ thấy một file có tên say_controller.rb,
trong file này có nội dung như sau:
class SayController < ApplicationController def hello end def goodbye end end
Ở đây chúng ta có lớp SayController
kế thừa từ lớp ApplicationController,
lớp này có 2 phương thức là hello
và goodbye
. Nếu bạn chưa từng học qua mô hình MVC thì ở đây bạn có thể hiểu nôm na một Controller là một file .rb, trong đó có nhiều hàm route, hàm route là các hàm xử lý một đường dẫn URL cụ thể.
Nếu bạn đã từng làm việc với Django hay Node.js thì bạn sẽ cần phải gọi các hàm cấu hình tương ứng cho từng URL tới từng hàm route cụ thể. Trong Rails cũng vậy, mặc định khi tạo một controller thì Rails đã định nghĩa cách các URL được chuyển đến các hàm route rồi. Chẳng hạn ở đây chúng ta có controller là Say
và hàm routing hello
và goodbye
trỏ đến các URL tương ứng là http://localhost:3000/say/hello
và http://localhost:3000/say/goodbye.
Chúng ta sẽ tìm hiểu về cách routing sau.
Hiện tại hàm hello
trong lớp SayController
chẳng làm gì cả, trang web được hiển thị như hình trên là nhờ vào file View, đó là file hello.html.erb
trong thư mục app/views/say
.
<h1>Say#hello</h1> Find me in app/views/say/hello.html.erb
Về bản chất thì các file này chỉ chứa code HTML, CSS… và một loại code đặc biệt nữa của riêng Rails dùng để kết nối giữa controller và view. Để ví dụ thì chúng ta sửa lại đoạn code trên như sau:
<h1>Hello world</h1> <p> Current time: <%= Time.now %> </p>
Loại code mà chúng ta đang nói đến ở đây được gọi chung là template, bạn để ý trong đoạn code trên, ngoài các thẻ h1
, p
của HTML thì có một thẻ khác là <%= %>
, những gì nằm trong cặp thẻ này sẽ được dịch bằng trình thông dịch Ruby, Ruby sẽ dịch đoạn code trong thẻ này và chuyển đổi thành các chuỗi bình thường. Chẳng hạn như <%=
Time.now
%>
sẽ được dịch thành chuỗi dạng như sau: 2016-10-25 10:43:12 +0700
Chúng ta lưu lại file này sau đó tải lại trang /say/hello
sẽ thấy kết quả dạng như sau:
Tuy nhiên trên thực tế thì chúng ta không gọi hàm trực tiếp như vậy, ma thay vào đó là ở trong hàm route sẽ tính toán một biến nào đó, rồi trong file view sẽ tham chiếu đến giá trị của biến đó. Ví dụ chúng ta sửa đoạn code trong file say_controller.rb
như sau:
class SayController < ApplicationController def hello @time = Time.now end def goodbye end end
Ở đây chúng ta lấy thời gian hiện tại của máy và lưu vào biến @time,
nếu bạn chưa biết thì ký tự @
chỉ định biến time
là biến instance, biến này chỉ thấy được trong từng đối tượng, nói cho dễ hiểu thì bạn có thể nghĩ biến này có phạm vi truy xuất tương tự như private
trong các ngôn ngữ hướng đối tượng khác.
Tiếp theo chúng ta sửa lại file hello.html.erb
như sau:
<h1>Hello world</h1> <p> Current time: <%= @time %> </p>
Lần này thay vì gọi trực tiếp hàm Time.now,
chúng ta gọi đến biến @time
trong lớp controller tương ứng.