Cách tạo ứng dụng Ruby on Rails
Rails là một khung ứng dụng web được viết bằng Ruby . Nó có một cách tiếp cận kiên định để phát triển ứng dụng, giả định các quy ước đặt ra phục vụ tốt nhất cho các nhà phát triển có mục tiêu chung. Do đó, Rails cung cấp các quy ước để xử lý định tuyến, dữ liệu trạng thái, quản lý tài sản, v.v. để cung cấp chức năng cơ bản mà hầu hết các ứng dụng web cần.Rails tuân theo mô hình kiến trúc model-view-controller (MCV), phân tách logic của ứng dụng, nằm trong các mô hình, khỏi định tuyến và trình bày thông tin ứng dụng. Cấu trúc này tổ chức - cùng với các công ước khác cho phép các nhà phát triển để extract mã vào những người giúp đỡ và partials - đảm bảo mã ứng dụng không được lặp đi lặp lại không cần thiết .
Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Rails cho phép user đăng thông tin về cá mập và hành vi của chúng. Nó sẽ là một điểm khởi đầu tốt cho việc phát triển ứng dụng sau này.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
-  Máy local  hoặc  server  phát triển chạy Ubuntu 18.04. Máy phát triển của bạn phải có  user  không phải root có  quyền  quản trị và firewall  được  cấu hình  với ufw. Để biết hướng dẫn về cách cài đặt điều này, hãy xem hướng dẫn Cài đặt server ban đầu với Ubuntu 18.04 của ta .
- Node.js và npm được cài đặt trên máy local hoặc server phát triển của bạn. Hướng dẫn này sử dụng Node.js version 10.16.3 và npm version 6.9.0 . Để biết hướng dẫn về cách cài đặt Node.js và npm trên Ubuntu 18.04, hãy làm theo hướng dẫn trong phần “Cài đặt bằng PPA” của Cách cài đặt Node.js trên Ubuntu 18.04 .
- Ruby, rbenv và Rails được cài đặt trên máy local hoặc server phát triển của bạn, hãy làm theo các Bước 1-4 trong Cách cài đặt Ruby on Rails với rbenv trên Ubuntu 18.04 . Hướng dẫn này sử dụng Ruby 2.5.1 , rbenv 1.1.2 và Rails 5.2.0 .
Bước 1 - Cài đặt SQLite3
Trước khi tạo ứng dụng Rails shark, ta cần đảm bảo ta có database để lưu trữ dữ liệu user . Rails được cấu hình để sử dụng SQLite theo mặc định và đây thường là một lựa chọn tốt trong quá trình phát triển. Vì dữ liệu ứng dụng của ta không yêu cầu khả năng mở rộng theo chương trình cấp cao, nên SQLite sẽ đáp ứng nhu cầu của ta .
Đầu tiên, hãy cập nhật index gói của bạn:
- sudo apt update 
Tiếp theo, cài đặt gói sqlite3 và libsqlite3-dev :
- sudo apt install sqlite3 libsqlite3-dev 
Thao tác này sẽ cài đặt cả SQLite và các file phát triển bắt buộc của nó.
Kiểm tra version của bạn để xác nhận cài đặt thành công:
- sqlite3 --version 
Output3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1 Với SQLite được cài đặt, bạn đã sẵn sàng để bắt đầu phát triển ứng dụng của bạn .
Bước 2 - Tạo một dự án rail mới
 Với database  của  ta  đã được cài đặt,  ta  có thể tạo một dự án Rails mới và xem xét một số mã soạn sẵn mặc định mà Rails cung cấp cho  ta  bằng lệnh rails new .
 Tạo một dự án có tên là sharkapp bằng lệnh sau:
- rails new sharkapp 
Bạn sẽ thấy rất nhiều kết quả cho bạn biết Rails đang tạo ra những gì cho dự án mới của bạn. Kết quả bên dưới nêu bật một số file , folder và lệnh quan trọng:
Output     create        . . .      create  Gemfile       . . .       create  app        . . .       create  app/controllers/application_controller.rb       . . .       create  app/models/application_record.rb       . . .       create  app/views/layouts/application.html.erb       . . .        create  config       create  config/routes.rb       create  config/application.rb       . . .        create  config/environments       create  config/environments/development.rb       create  config/environments/production.rb       create  config/environments/test.rb       . . .       create  config/database.yml       create  db       create  db/seeds.rb       . . .           run  bundle install       . . .  Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.       . . .  * bin/rake: Spring inserted * bin/rails: Spring inserted Kết quả được đánh dấu ở đây cho bạn biết rằng Rails đã tạo như sau:
-  Gemfile: Tệp này liệt kê các phụ thuộc gem cho ứng dụng của bạn. Gem là một gói phần mềm Ruby và Gemfile cho phép bạn quản lý các nhu cầu phần mềm của dự án.
-  app: Thư mụcapplà nơi chứa mã ứng dụng chính của bạn. Điều này bao gồm các mô hình, bộ điều khiển, chế độ xem, nội dung, trình trợ giúp và trình gửi thư tạo nên chính ứng dụng. Rails cung cấp cho bạn một số bản soạn sẵn cấp ứng dụng cho mô hình MCV để bắt đầu trong các file nhưapp/models/application_record.rb,app/controllers/application_controller.rbvàapp/views/layouts/application.html.erb.
-  config: Thư mục này chứa cài đặt cấu hình ứng dụng của bạn:-  config/routes.rb: Khai báo lộ trình của ứng dụng của bạn nằm trong file này.
-  config/application.rb: Cài đặt chung cho các thành phần ứng dụng của bạn nằm trong file này.
 
-  
-  config/environments: Thư mục này là nơi đặt các cài đặt cấu hình cho môi trường của bạn. Rails bao gồm ba môi trường theo mặc định:development,productionvàtest.
-  config/database.yml: Cài đặt cấu hình database nằm trong file này, được chia thành bốn phần:default,development,productionvàtest. Nhờ có Gemfile đi kèm với lệnhrails new, bao gồm gemsqlite3, fileconfig/database.ymlcủa ta đã đặt tham sốadapterthànhsqlite3, chỉ định rằng ta sẽ sử dụng database SQLite với ứng dụng này.
-  db: Thư mục này bao gồm một folder để di chuyển database được gọi làmigrate, cùng với cácschema.rbvàseeds.rbschema.dbchứa thông tin về database của bạn, trong khiseeds.rblà nơi bạn có thể đặt dữ liệu hạt giống cho database .
 Cuối cùng, Rails chạy lệnh bundle install để cài đặt các phụ thuộc được liệt kê trong Gemfile của bạn.
 Khi mọi thứ đã được  cài đặt , hãy  chuyển  đến folder  sharkapp :
- cd sharkapp 
 Đến đây bạn  có thể khởi động  server  Rails  đảm bảo  rằng ứng dụng của bạn đang hoạt động bằng cách sử dụng lệnh rails server . Nếu bạn đang làm việc trên máy local   của bạn , hãy nhập:
- rails server  
Rails liên kết với localhost theo mặc định, vì vậy bây giờ bạn có thể truy cập ứng dụng  của bạn  bằng cách  chuyển  trình duyệt của bạn đến locahost:3000 , nơi bạn sẽ thấy hình ảnh sau: 
 Nếu bạn đang làm việc trên  server  phát triển, trước tiên hãy  đảm bảo  các kết nối được phép trên cổng 3000 :
- sudo ufw allow 3000 
Sau đó, khởi động  server  với cờ --binding , để liên kết với IP  server  của bạn:
- rails server --binding=your_server_ip 
Điều hướng đến http:// your_server_ip :3000 trong trình duyệt của bạn, nơi bạn sẽ thấy thông báo chào mừng Rails.
 Khi bạn đã quan sát xung quanh, bạn có thể dừng  server  bằng CTRL+C
Với ứng dụng của bạn đã được tạo và đặt tại chỗ, bạn đã sẵn sàng bắt đầu xây dựng từ bảng soạn sẵn Rails để tạo một ứng dụng duy nhất.
Bước 3 - Dàn dựng ứng dụng
 Để tạo ứng dụng thông tin cá mập  của bạn ,  ta   cần  tạo một mô hình để quản lý dữ liệu ứng dụng  của bạn , các khung nhìn để cho phép  user  tương tác với dữ liệu đó và một bộ điều khiển để quản lý giao tiếp giữa mô hình và các khung nhìn. Để xây dựng những thứ này,  ta  sẽ sử dụng lệnh rails generate scaffold , lệnh này sẽ cung cấp cho  ta  một mô hình, một sự di chuyển database  để thay đổi schemas  database , một bộ điều khiển, một tập hợp đầy đủ các chế độ xem để quản lý Tạo, Đọc, Cập nhật và Xóa (CRUD) hoạt động cho ứng dụng và các mẫu cho các phần, trình trợ giúp và kiểm tra.
 Vì lệnh generate scaffold có rất nhiều tác dụng đối với  ta , nên  ta  sẽ xem xét kỹ hơn các tài nguyên mà nó tạo ra để hiểu công việc mà Rails đang thực hiện.
 Lệnh generate scaffold của  ta  sẽ bao gồm tên của mô hình của  ta  và các trường  ta  muốn trong bảng database  của  ta . Rails sử dụng Active Record để quản lý mối quan hệ giữa dữ liệu ứng dụng, được xây dựng dưới dạng đối tượng với các mô hình và database  ứng dụng. Mỗi mô hình của  ta  là một lớp Ruby , đồng thời kế thừa từ lớp ActiveRecord::Base . Điều này  nghĩa là   ta  có thể làm việc với lớp mô hình  của bạn  theo cách giống như cách  ta  làm việc với lớp Ruby, đồng thời lấy các phương thức từ Active Record. Active Record sau đó sẽ  đảm bảo  mỗi lớp được ánh xạ tới một bảng trong database  của  ta  và mỗi version  của lớp đó vào một hàng trong bảng đó.
 Nhập lệnh sau để tạo mô hình Shark , bộ điều khiển và các dạng xem liên quan:
- rails generate scaffold Shark name:string facts:text 
Với name:string và facts:text  ta  đang cung cấp cho Rails thông tin về các trường mà  ta  muốn trong bảng database   của bạn  và loại dữ liệu mà chúng nên chấp nhận. Cả hai sẽ cung cấp cho  ta  chỗ để nhập những gì  ta  muốn, mặc dù text sẽ cho phép nhiều ký tự hơn cho sự kiện cá mập.
Khi gõ lệnh này, bạn sẽ lại thấy một danh sách dài các kết quả giải thích mọi thứ mà Rails đang tạo cho bạn. Kết quả bên dưới nêu bật một số điều quan trọng hơn đối với cài đặt của ta :
Output      invoke  active_record       create    db/migrate/20190804181822_create_sharks.rb       create    app/models/shark.rb       . . .       invoke  resource_route        route    resources :sharks       invoke  scaffold_controller       create    app/controllers/sharks_controller.rb       invoke    erb       create      app/views/sharks       create      app/views/sharks/index.html.erb       create      app/views/sharks/edit.html.erb       create      app/views/sharks/show.html.erb       create      app/views/sharks/new.html.erb       create      app/views/sharks/_form.html.erb       . . . Rails đã tạo mô hình tại app/models/shark.rb và di chuyển database  để đi cùng với nó: db/migrate/ 20190804181822 _create_sharks.rb . Dấu thời gian trên file  di chuyển của bạn sẽ khác với những gì bạn thấy ở đây.
 Nó cũng đã tạo một bộ điều khiển, app/controllers/sharks_controller.rb , cũng như các chế độ xem được liên kết với hoạt động CRUD của ứng dụng của  ta , được thu thập trong app/views/sharks . Trong số các chế độ xem này có một phần, _form.html.erb , chứa mã được sử dụng trên các chế độ xem.
 Cuối cùng, Rails đã thêm một tuyến tài nguyên mới, resources :sharks , vào config/routes.rb . Điều này cho phép bộ định tuyến Rails khớp các yêu cầu HTTP đến với bộ điều khiển sharks và các khung nhìn liên quan của nó.
Mặc dù Rails đã thực hiện rất nhiều công việc xây dựng mã ứng dụng cho ta , nhưng bạn nên xem một số file để hiểu điều gì đang xảy ra.
Đầu tiên, hãy xem file điều khiển bằng lệnh sau:
- cat app/controllers/sharks_controller.rb 
Outputclass SharksController < ApplicationController   before_action :set_shark, only: [:show, :edit, :update, :destroy]    # GET /sharks   # GET /sharks.json   def index     @sharks = Shark.all   end    # GET /sharks/1   # GET /sharks/1.json   def show   end    # GET /sharks/new   def new     @shark = Shark.new   end    # GET /sharks/1/edit   def edit   end    # POST /sharks   # POST /sharks.json   def create     @shark = Shark.new(shark_params)      respond_to do |format|       if @shark.save         format.html { redirect_to @shark, notice: 'Shark was successfully created.' }         format.json { render :show, status: :created, location: @shark }       else         format.html { render :new }         format.json { render json: @shark.errors, status: :unprocessable_entity }       end     end   end    # PATCH/PUT /sharks/1   # PATCH/PUT /sharks/1.json   def update     respond_to do |format|       if @shark.update(shark_params)         format.html { redirect_to @shark, notice: 'Shark was successfully updated.' }         format.json { render :show, status: :ok, location: @shark }       else         format.html { render :edit }         format.json { render json: @shark.errors, status: :unprocessable_entity }       end     end   end    # DELETE /sharks/1   # DELETE /sharks/1.json   def destroy     @shark.destroy     respond_to do |format|       format.html { redirect_to sharks_url, notice: 'Shark was successfully destroyed.' }       format.json { head :no_content }     end   end    private     # Use callbacks to share common setup or constraints between actions.     def set_shark       @shark = Shark.find(params[:id])     end      # Never trust parameters from the scary internet, only allow the white list through.     def shark_params       params.require(:shark).permit(:name, :facts)     end end Bộ điều khiển chịu trách nhiệm quản lý cách thông tin được tìm nạp và chuyển đến mô hình liên quan của nó và cách nó được liên kết với các dạng xem cụ thể.  Như bạn thấy , bộ điều khiển sharks của  ta  bao gồm một loạt các phương pháp ánh xạ gần đúng với các hoạt động CRUD tiêu chuẩn. Tuy nhiên, có nhiều phương pháp hơn chức năng CRUD, để kích hoạt hiệu quả trong trường hợp có lỗi.
 Ví dụ: hãy xem xét phương pháp create :
. . .   def create     @shark = Shark.new(shark_params)      respond_to do |format|       if @shark.save         format.html { redirect_to @shark, notice: 'Shark was successfully created.' }         format.json { render :show, status: :created, location: @shark }       else         format.html { render :new }         format.json { render json: @shark.errors, status: :unprocessable_entity }       end     end   end . . .  Nếu một version  mới của lớp Shark được lưu thành công, redirect_to sẽ tạo ra một yêu cầu mới sau đó được chuyển hướng đến bộ điều khiển. Đây sẽ là một yêu cầu GET và nó sẽ được xử lý bằng phương thức show , phương thức này sẽ hiển thị cho  user  con cá mập mà họ vừa thêm vào.
 Nếu không thành công, thì Rails sẽ hiển thị lại mẫu app/views/sharks/new.html.erb thay vì đưa ra một yêu cầu khác tới bộ định tuyến, cho  user  một cơ hội khác để gửi dữ liệu của họ.
 Ngoài bộ điều khiển cá mập, Rails đã cung cấp cho  ta  một mẫu cho chế độ xem index , bản đồ này ánh xạ tới phương thức index trong bộ điều khiển của  ta .  Ta  sẽ sử dụng nó làm chế độ xem root  cho ứng dụng  của bạn , vì vậy bạn nên xem qua nó.
Nhập nội dung sau để xuất file :
- cat app/views/sharks/index.html.erb 
Output<p id="notice"><%= notice %></p>  <h1>Sharks</h1>  <table>   <thead>     <tr>       <th>Name</th>       <th>Facts</th>       <th colspan="3"></th>     </tr>   </thead>    <tbody>     <% @sharks.each do |shark| %>       <tr>         <td><%= shark.name %></td>         <td><%= shark.facts %></td>         <td><%= link_to 'Show', shark %></td>         <td><%= link_to 'Edit', edit_shark_path(shark) %></td>         <td><%= link_to 'Destroy', shark, method: :delete, data: { confirm: 'Are you sure?' } %></td>       </tr>     <% end %>   </tbody> </table>  <br>  <%= link_to 'New Shark', new_shark_path %> Chế độ xem index lặp lại qua các version  của lớp Shark của  ta , đã được ánh xạ tới bảng sharks trong database  của  ta . Sử dụng tạo khuôn mẫu ERB , dạng xem xuất ra từng trường từ bảng được liên kết với một cá thể cá mập riêng lẻ: name và facts .
 Sau đó, dạng xem sử dụng trình trợ giúp link_to để tạo siêu liên kết, với chuỗi được cung cấp làm văn bản cho liên kết và đường dẫn được cung cấp làm đích. Bản thân các con đường được thực hiện thông qua các trợ giúp có sẵn cho  ta  khi  ta  xác định tuyến đường tháo vát của sharks với lệnh rails generate scaffold .
 Ngoài việc xem xét chế độ xem index của  ta ,  ta  cũng có thể xem chế độ xem new để xem cách Rails sử dụng các thành phần trong các chế độ xem. Nhập thông tin sau để xuất ra mẫu app/views/sharks/new.html.erb :
- cat app/views/sharks/new.html.erb 
Output<h1>New Shark</h1>  <%= render 'form', shark: @shark %>  <%= link_to 'Back', sharks_path %> Mặc dù mẫu này có thể trông giống như thiếu các trường đầu vào cho một mục nhập cá mập mới, nhưng tham chiếu đến render 'form' cho  ta  biết rằng mẫu đang kéo phần _form.html.erb , phần này   extract   mã được lặp lại trên các chế độ xem.
Nhìn vào file đó sẽ cho ta cảm nhận đầy đủ về cách một cá thể cá mập mới được tạo:
- cat app/views/sharks/_form.html.erb 
Output<%= form_with(model: shark, local: true) do |form| %>   <% if shark.errors.any? %>     <div id="error_explanation">       <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2>        <ul>       <% shark.errors.full_messages.each do |message| %>         <li><%= message %></li>       <% end %>       </ul>     </div>   <% end %>    <div class="field">     <%= form.label :name %>     <%= form.text_field :name %>   </div>    <div class="field">     <%= form.label :facts %>     <%= form.text_area :facts %>   </div>    <div class="actions">     <%= form.submit %>   </div> <% end %> Mẫu này sử dụng trình trợ giúp form_with form . Trình trợ giúp biểu mẫu được thiết kế để tạo thuận lợi cho việc tạo các đối tượng mới từ đầu vào của  user  bằng cách sử dụng các trường và phạm vi của các mô hình cụ thể. Ở đây, form_with mất model: shark như một cuộc tranh cãi, và các đối tượng hình thức xây dựng mới mà nó tạo ra có đầu vào trường tương ứng với các trường trong sharks bảng. Do đó  user  có trường biểu mẫu để nhập cả một con cá mập name và cá mập facts .
 Việc gửi biểu mẫu này sẽ tạo phản hồi JSON với dữ liệu  user  mà phần còn lại của ứng dụng của bạn có thể truy cập bằng phương thức tham số , phương thức này sẽ tạo đối tượng ActionController::Parameters với dữ liệu đó.
  Đến đây bạn  đã biết rails generate scaffold đã tạo ra cho bạn, bạn có thể chuyển sang  cài đặt  chế độ xem root  cho ứng dụng  của bạn .
Bước 4 - Tạo Chế độ xem root ứng dụng và Chức năng Kiểm tra
Lý tưởng nhất là bạn muốn trang đích của ứng dụng của bạn ánh xạ tới folder root của ứng dụng, để user có thể hiểu ngay mục đích của ứng dụng.
 Có một số cách bạn có thể xử lý vấn đề này: ví dụ: bạn có thể tạo bộ điều khiển Welcome và chế độ xem index liên kết, điều này sẽ cung cấp cho  user  một trang đích chung cũng có thể liên kết đến các phần khác nhau của ứng dụng. Tuy nhiên, trong trường hợp của  ta , việc để  user  truy cập vào chế độ xem cá mập index của  ta  sẽ đủ để giới thiệu về mục đích của ứng dụng lúc này.
 Để  cài đặt  điều này, bạn  cần  phải sửa đổi cài đặt định tuyến trong config/routes.rb để chỉ định root  của ứng dụng.
 Mở config/routes.rb để chỉnh sửa, sử dụng nano  hoặc editor bạn quen dùng :
- nano config/routes.rb 
Tệp sẽ trông như thế này:
Rails.application.routes.draw do   resources :sharks   # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end Nếu không đặt thứ gì đó cụ thể hơn, chế độ xem mặc định tại http://localhost:3000 hoặc http:// your_server_ip :3000 sẽ là trang chào mừng Rails mặc định.
 Để ánh xạ chế độ xem root  của ứng dụng sang chế độ xem index của trình điều khiển cá mập, bạn  cần  thêm dòng sau vào file :
Rails.application.routes.draw do   resources :sharks    root 'sharks#index'    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end Như vậy, khi user chuyển đến folder root ứng dụng của bạn, họ sẽ thấy danh sách đầy đủ về cá mập và có cơ hội tạo mục nhập cá mập mới, xem các mục hiện có và chỉnh sửa hoặc xóa các mục đã cho.
 Lưu file  và thoát khỏi  editor  khi bạn chỉnh sửa xong. Nếu bạn đã sử dụng nano để chỉnh sửa file , bạn  có thể thực hiện bằng cách  nhấn CTRL+X , Y , sau đó ENTER
Đến đây bạn có thể chạy quá trình di chuyển của bạn bằng lệnh sau:
- rails db:migrate 
Bạn sẽ thấy kết quả xác nhận việc di chuyển.
Khởi động lại server Rails của bạn. Nếu bạn đang làm việc tại local , hãy nhập:
- rails s 
Trên server phát triển, nhập:
- rails s --binding=your_server_ip 
Điều hướng đến localhost:3000 nếu bạn đang làm việc local  hoặc http:// your_server_ip :3000 nếu bạn đang làm việc trên  server  phát triển.
Trang đích ứng dụng của bạn sẽ giống như sau:
 Để tạo một con cá mập mới, hãy nhấp vào liên kết Cá mập mới ở cuối trang, liên kết này sẽ đưa bạn đến sharks/new đường sharks/new : 
Hãy thêm một số thông tin demo để kiểm tra ứng dụng của ta . Nhập “Great White” vào trường Tên và “Đáng sợ” vào trường Sự kiện :
Bấm vào nút Tạo để tạo cá mập.
 Điều này sẽ hướng bạn đến lộ show , nhờ bộ lọc before_action , được đặt bằng phương thức set_shark , lấy id của cá mập mà  ta  vừa tạo:
class SharksController < ApplicationController   before_action :set_shark, only: [:show, :edit, :update, :destroy]    . . .     def show   end    . . .     private     # Use callbacks to share common setup or constraints between actions.     def set_shark       @shark = Shark.find(params[:id])     end   . . .  Bạn có thể kiểm tra chức năng chỉnh sửa ngay bây giờ bằng cách nhấp vào Chỉnh sửa trên mục nhập cá mập của bạn. Điều này sẽ đưa bạn đến lộ trình edit cho con cá mập đó: 
 Thay đổi facts về Great White thành “Large” thay vì “Scary” và nhấp vào Update Shark . Điều này sẽ đưa bạn trở lại lộ show : 
 Cuối cùng, nhấp vào Quay lại sẽ đưa bạn đến chế độ xem index cập nhật của bạn: 
Đến đây bạn đã kiểm tra chức năng cơ bản của ứng dụng, bạn có thể thêm một số xác thực và kiểm tra bảo mật để làm cho mọi thứ an toàn hơn.
Bước 5 - Thêm xác thực
Ứng dụng cá mập của bạn có thể chấp nhận đầu vào từ user , nhưng hãy tưởng tượng trường hợp user cố gắng tạo một con cá mập mà không thêm dữ kiện vào nó hoặc tạo mục nhập cho một con cá mập đã có trong database . Bạn có thể tạo cơ chế để kiểm tra dữ liệu trước khi dữ liệu được nhập vào database bằng cách thêm xác nhận vào mô hình của bạn. Vì logic của ứng dụng của bạn được đặt trong các mô hình của nó, việc xác thực dữ liệu đầu vào ở đây có ý nghĩa hơn so với việc làm như vậy ở những nơi khác trong ứng dụng.
Lưu ý ta sẽ không đề cập đến việc viết các bài kiểm tra xác thực trong hướng dẫn này, nhưng bạn có thể tìm hiểu thêm về kiểm thử bằng cách tham khảo tài liệu Rails .
 Nếu bạn vẫn chưa dừng  server , hãy tiếp tục và thực hiện việc đó  bằng lệnh  CTRL+C
 Mở file  mô hình shark.rb của bạn:
- nano app/models/shark.rb 
Hiện tại, file  cho  ta  biết rằng lớp Shark kế thừa từ ApplicationRecord , lớp này kế thừa từ ActiveRecord::Base :
class Shark < ApplicationRecord end Trước tiên, hãy thêm một số xác thực vào trường name của  ta  để  xác nhận  trường đã được điền và mục nhập là duy nhất, ngăn các mục nhập trùng lặp:
class Shark < ApplicationRecord   validates :name, presence: true, uniqueness: true end Tiếp theo, thêm xác thực cho trường facts  đảm bảo  rằng nó cũng được điền:
class Shark < ApplicationRecord   validates :name, presence: true, uniqueness: true   validates :facts, presence: true end Ở đây, ta ít quan tâm đến tính độc nhất của các dữ kiện, miễn là chúng có liên quan đến các mục cá mập độc nhất.
Lưu file khi bạn hoàn tất.
 Khởi động lại  server  của bạn bằng rails s hoặc rails s --binding= your_server_ip , tùy thuộc vào việc bạn đang làm việc local  hay với  server  phát triển.
 Điều hướng đến folder  root  của ứng dụng của bạn tại http://localhost:3000 hoặc http:// your_server_ip :3000 .
Nhấp vào Cá mập mới . Trong biểu mẫu, thêm “Great White” vào trường Tên và “Răng to” vào trường Sự kiện , sau đó nhấp vào Tạo cá mập . Bạn sẽ thấy cảnh báo sau:
Bây giờ, hãy xem liệu ta có thể kiểm tra xác nhận khác của bạn hay không. Nhấp vào Quay lại để quay lại trang chủ, sau đó nhấp vào Cá mập mới . Trong biểu mẫu mới, hãy nhập "Tiger Shark" vào trường Tên và để trống Dữ kiện . Nhấp vào Create Shark sẽ kích hoạt cảnh báo sau:
Với những thay đổi này, ứng dụng của bạn có một số xác nhận đảm bảo tính nhất quán trong dữ liệu được lưu vào database . Như vậy, bạn có thể chuyển sự chú ý sang user ứng dụng của bạn và xác định ai có thể sửa đổi dữ liệu ứng dụng.
Bước 6 - Thêm xác thực
 Với việc xác thực tại chỗ,  ta  có một số đảm bảo về dữ liệu đang được lưu vào database . Nhưng  user  thì sao? Nếu  ta  không muốn bất kỳ và tất cả  user  thêm vào database , thì  ta  nên thêm một số biện pháp xác thực  đảm bảo  rằng chỉ những  user  được phép mới có thể thêm cá mập. Để thực hiện việc này,  ta  sẽ sử dụng phương thức http_basic_authenticate_with , cho phép  ta  tạo kết hợp tên  user  và password  để xác thực  user .
 Có một số cách để xác thực  user  với Rails, bao gồm cả làm việc với bcrypt hoặc phát minh devise đá quý. Tuy nhiên, hiện tại,  ta  sẽ thêm một phương thức vào bộ điều khiển ứng dụng của  ta  để áp dụng cho các hành động trên ứng dụng của  ta . Điều này sẽ hữu ích nếu  ta  thêm nhiều bộ điều khiển hơn vào ứng dụng trong tương lai.
 Dừng lại  server  của bạn bằng CTRL+C
 Mở file  xác định ApplicationController của bạn:
- nano app/controllers/application_controller.rb 
Bên trong, bạn sẽ thấy định nghĩa cho lớp ApplicationController , lớp mà các bộ điều khiển khác trong ứng dụng của bạn kế thừa:
class ApplicationController < ActionController::Base end Để xác thực  user ,  ta  sẽ sử dụng tên  user  và password  được mã hóa cứng với phương thức http_basic_authenticate_with . Thêm mã sau vào file :
class ApplicationController < ActionController::Base   http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show] end Ngoài việc cung cấp tên  user  và password  ở đây,  ta  cũng đã hạn chế xác thực bằng cách chỉ định các tuyến mà nó không được yêu cầu: index và show . Một cách khác để thực hiện điều này là only: [:create, :update, :destroy] viết only: [:create, :update, :destroy] . Bằng cách này, tất cả  user  sẽ có thể nhìn thấy tất cả các loài cá mập và đọc thông tin về các loài cá mập cụ thể. Tuy nhiên, khi nói đến việc sửa đổi nội dung trang web,  user   cần  chứng minh rằng họ có quyền truy cập.
Trong một cài đặt mạnh mẽ hơn, bạn sẽ không muốn mã hóa các giá trị theo cách này, nhưng với mục đích demo , điều này sẽ cho phép bạn xem cách bạn có thể bao gồm xác thực cho các tuyến ứng dụng của bạn . Nó cũng cho phép bạn xem cách Rails lưu trữ dữ liệu phiên theo mặc định trong cookie: sau khi bạn xác thực trên một hành động được chỉ định, bạn sẽ không bị yêu cầu xác thực lại trong cùng một phiên.
 Lưu và đóng app/controllers/application_controller.rb khi bạn chỉnh sửa xong.  Đến đây bạn  có thể kiểm tra xác thực trong thực tế.
 Khởi động  server  bằng rails s hoặc rails s --binding= your_server_ip và  chuyển  đến ứng dụng của bạn tại http://localhost:3000 hoặc http:// your_server_ip :3000 .
Trên trang đích, nhấp vào nút Cá mập mới . Điều này sẽ kích hoạt cửa sổ xác thực sau:
 Nếu bạn nhập tổ hợp tên  user  và password  mà bạn đã thêm vào app/controllers/application_controller.rb ,  bạn có thể  tạo một con cá mập mới một cách an toàn.
Đến đây bạn có một ứng dụng cá mập đang hoạt động, hoàn chỉnh với các xác thực dữ liệu và một sơ đồ xác thực cơ bản.
Kết luận
Ứng dụng Rails bạn đã tạo trong hướng dẫn này là một điểm khởi đầu mà bạn có thể sử dụng để phát triển thêm. Nếu bạn quan tâm đến việc khám phá hệ sinh thái Rails, thì tài liệu dự án là một nơi tuyệt vời để bắt đầu.
Bạn cũng có thể tìm hiểu thêm về cách thêm tài nguyên lồng nhau vào dự án của bạn bằng cách đọc Cách tạo tài nguyên lồng nhau cho ứng dụng Ruby on Rails , phần này sẽ chỉ cho bạn cách xây dựng các mô hình và tuyến ứng dụng của bạn.
Ngoài ra, bạn có thể cần khám phá cách cài đặt giao diện user mạnh mẽ hơn cho dự án của bạn với một khuôn khổ như React . Cách cài đặt dự án Ruby on Rails với React Frontend cung cấp hướng dẫn về cách thực hiện việc này.
Nếu bạn muốn khám phá các tùy chọn database khác nhau, bạn cũng có thể xem Cách sử dụng PostgreSQL với Ứng dụng Ruby on Rails của bạn trên Ubuntu 18.04 , hướng dẫn cách làm việc với PostgreSQL thay vì SQLite. Bạn cũng có thể tham khảo thư viện hướng dẫn PostgreSQL của ta để tìm hiểu thêm về cách làm việc với database này.
Các tin liên quan
 

