Bài 6: Views và Asset Pipeline
ERB và Layouts
ERB (Embedded Ruby) là template engine mặc định trong Rails, cho phép bạn nhúng Ruby code vào HTML.
Cú pháp cơ bản của ERB
<% # Ruby code không xuất ra output %>
<%= # Ruby code có xuất ra output %>
Layouts
Layouts định nghĩa cấu trúc chung cho các trang trong ứng dụng.
<!-- app/views/layouts/application.html.erb -->
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title) %></title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
Helpers và Partials
View Helpers
Helpers là modules chứa các methods hỗ trợ trong views.
# app/helpers/application_helper.rb
module ApplicationHelper
def full_title(page_title = '')
base_title = "My Rails App"
page_title.empty? ? base_title : "#{page_title} | #{base_title}"
end
end
Sử dụng trong view:
<title><%= full_title(yield(:title)) %></title>
Partials
Partials cho phép bạn chia nhỏ views thành các phần có thể tái sử dụng.
<!-- app/views/shared/_error_messages.html.erb -->
<% if object.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(object.errors.count, "error") %> prohibited this <%= object.class.name.downcase %> from being saved:</h2>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
Sử dụng partial:
<%= render 'shared/error_messages', object: @user %>
Asset Pipeline
Asset Pipeline là một framework để nén và fingerprint JavaScript, CSS, và image files.
Cấu trúc thư mục
app/assets
|- images
|- javascripts
|- stylesheets
Manifest Files
Manifest files chỉ định các assets cần được bao gồm.
// app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require_tree .
/* app/assets/stylesheets/application.css */
/*
*= require_self
*= require_tree .
*/
Asset Helpers
Rails cung cấp các helper methods để link đến assets.
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= image_tag 'logo.png', alt: 'Logo' %>
Webpacker
Từ Rails 6, Webpacker được sử dụng mặc định để quản lý JavaScript.
Cấu hình Webpacker
# config/webpacker.yml
default: &default
source_path: app/javascript
source_entry_path: packs
public_root_path: public
public_output_path: packs
cache_path: tmp/cache/webpacker
...
Sử dụng Webpacker
<%= javascript_pack_tag 'application' %>
<%= stylesheet_pack_tag 'application' %>
AJAX trong Rails
Rails hỗ trợ AJAX thông qua UJS (Unobtrusive JavaScript).
Remote Forms
<%= form_with(model: @post, remote: true) do |form| %>
<%= form.text_field :title %>
<%= form.submit %>
<% end %>
Responding to AJAX requests
# app/controllers/posts_controller.rb
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.js # Renders create.js.erb
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
// app/views/posts/create.js.erb
$('#posts').append('<%= j render(@post) %>');
$('#post_title').val('');
Responsive Design với Rails
Rails hỗ trợ responsive design thông qua CSS và JavaScript.
Responsive CSS
// app/assets/stylesheets/responsive.scss
@media (max-width: 768px) {
.container {
width: 100%;
}
}
Responsive Images
<%= image_tag 'logo.png', srcset: { 'logo@2x.png' => '2x', 'logo@3x.png' => '3x' }, alt: 'Logo' %>
Internationalization (I18n)
Rails cung cấp framework I18n để hỗ trợ đa ngôn ngữ.
Cấu hình I18n
# config/application.rb
config.i18n.default_locale = :en
config.i18n.available_locales = [:en, :vi]
Sử dụng I18n trong Views
<h1><%= t('welcome.title') %></h1>
<p><%= t('welcome.message', name: current_user.name) %></p>
# config/locales/en.yml
en:
welcome:
title: "Welcome to our site!"
message: "Hello, %{name}!"
# config/locales/vi.yml
vi:
welcome:
title: "Chào mừng đến với trang web của chúng tôi!"
message: "Xin chào, %{name}!"
Kết luận
Views và Asset Pipeline là những phần quan trọng trong việc xây dựng giao diện người dùng trong Rails. Chúng cung cấp các công cụ mạnh mẽ để tạo ra các ứng dụng web động và responsive.
Trong thực tế, việc sử dụng hiệu quả các công cụ này đòi hỏi sự cân nhắc về hiệu suất và khả năng bảo trì. Việc tổ chức code tốt, sử dụng partials và helpers một cách thông minh, và tối ưu hóa assets có thể cải thiện đáng kể trải nghiệm người dùng và khả năng phát triển của ứng dụng.
Trong bài tiếp theo, chúng ta sẽ tìm hiểu về Controllers và Request Handling trong Rails, khám phá cách Rails xử lý các yêu cầu từ người dùng và chuẩn bị dữ liệu cho Views.