Rails – Tạo project Rails

2.1/5 - (88 votes)

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.

capture

Để 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à hellogoodbye. 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à hellogoodbye. 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 hellogoodbye trỏ đến các URL tương ứng là http://localhost:3000/say/hellohttp://localhost:3000/say/goodbye. Chúng ta sẽ tìm hiểu về cách routing sau.

capture

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:

capture

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.

5 3 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

8 Comments
Inline Feedbacks
View all comments
haitm
haitm
6 năm trước

thank you ad :). Bai viet hay

thua
thua
6 năm trước

gem load error is: could not find javacript runtime. see https://github.com/rails/execjs
loi gi vay anh

trình
trình
6 năm trước

ad ơi..sao em tạo đc rails rồi nhưng khi chạy lại k đc ạ? và báo lỗi là : => Booting Puma => Rails 5.1.4 application starting in development => Run rails server -h for more startup options *** SIGUSR2 not implemented, signal based restart unavailable! *** SIGUSR1 not implemented, signal based restart unavailable! *** SIGHUP not implemented, signal based logs reopening unavailable! Puma starting in single mode… * Version 3.11.0 (ruby 2.4.3-p205), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop mong ad giúp em ạ!! em… Đọc thêm »

PAT
PAT
6 năm trước

Bài viết rất hay. Tuy có thể sẽ có nhiều khó khăn khi những bạn mới học lúc cài dùng rails 5 nên có 1 số lỗi frame work :). Nhưng cái quan trọng mình thấy là ad cung cấp cho mọi người luồng hoạt động. cái này quan trọng hơn mấy thứ còn lại 🙂 😀 Cảm ơn bạn nhiều.