Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Làm chủ Rendering trong Rails: Hướng dẫn toàn diện

Rendering trong Rails là gì?

Rendering là mục tiêu cuối cùng của ứng dụng Ruby on Rails của bạn. Bạn render một view, thường là file .html.erb, chứa hỗn hợp HTML và code Ruby.

View là thứ người dùng nhìn thấy.

Đó là kết quả của tất cả công việc ứng dụng Rails phải làm. View kết hợp logic, dữ liệu và template view để phục vụ yêu cầu của người dùng.

Ngay cả việc trả về phản hồi JSON cũng có thể coi là một view.

Đó là lý do học mọi thứ có thể về hệ thống rendering trong Rails là quan trọng nếu bạn không muốn mọi công sức của mình bị lãng phí.

Rendering trong Rails có thể tạo ra hành vi bất ngờ. Vì vậy, càng hiểu rõ càng tốt.

Hãy bắt đầu từ cơ bản!

Cơ bản về Rendering View

Mặc định, bạn không cần yêu cầu Rails render bất cứ thứ gì và view vẫn sẽ hoạt động miễn là mọi thứ được thiết lập đúng.

Đây là một phần của "Convention over Configuration" (Quy ước胜过配置).

Cơ chế đó hoạt động như thế nào?

Rails đưa ra các giả định, mà bạn có thể không hay biết.

Nó giúp bạn tiết kiệm công sức.

Nhưng nếu bạn không biết những gì đang xảy ra, nó có thể giống như phép màu.

Đó chính là nơi bạn có thể gặp rắc rối!

Trong trường hợp này, giả định của Rails là bạn muốn render một template có cùng tên với action controller đang xử lý yêu cầu.

Vì vậy nếu bạn gọi BooksController#index… Rails sẽ render books/index.erb.

Bây giờ:

Bạn có thể kiểm soát nhiều hơn việc rendering này.

Điều đó cho phép bạn render một view khác thay vì mặc định.

Cách làm như sau:

class BooksController < ApplicationController
  def index
    render :listing
  end
end

Điều này sẽ render books/listing.erb (hoặc .haml nếu bạn dùng HAML).

Bạn có thể dùng chuỗi thay vì symbol.

Như sau:

render 'shared/buttons'

Rails sẽ render shared/buttons.erb.

Một điều bạn cần biết

Rendering một view liên quan đến action khác sẽ không chạy action đó.

Nói cách khác, gọi render :index bên trong create sẽ không chạy phương thức index.

Tại sao điều đó quan trọng?

Bởi vì các biến instance cho view đó sẽ không được thiết lập!

Bạn phải tự thiết lập chúng.

Ví dụ:

def index
  @users = User.all
end
# Thiếu `@users` ở đây sẽ gây lỗi hoặc view index trống
# Bạn có thể dùng `redirect_to` thay vào đó, khi đó `index` sẽ chạy
def create
  render :index
end

Còn rất nhiều điều về rendering hơn thế này.

Hãy tiếp tục!

Các loại Rendering khác nhau

Ngoài rendering template, bạn còn có các lựa chọn khác.

Bạn có thể:

  • Render chuỗi HTML
  • Render chuỗi văn bản thuần túy
  • Render JSON

Rendering chuỗi có thể hữu ích trong phát triển để hiển thị thông báo lỗi nếu bạn chưa có template phù hợp xử lý lỗi.

Hoặc nếu bạn chưa sẵn sàng viết view cho một action controller cụ thể.

Ví dụ:

if @user
  render :show
else
  render plain: "User not found."
end

Rendering JSON trực tiếp có thể dùng để xây dựng API đơn giản, đó không phải cách tốt nhất nhưng giúp bạn bắt đầu.

Ví dụ:

render json: @user

Tôi chưa từng dùng render HTML, nhưng nếu bạn có trường hợp sử dụng tốt hãy cho tôi biết!

Cách Render Partials

Rendering vượt ra khỏi controller.

Bạn cũng có thể render view bên trong view.

Chúng ta gọi đó là partial.

Tại sao bạn muốn làm vậy?

Code sạch hơn và tái sử dụng code.

Nếu bạn dùng cùng một form trên 3 trang khác nhau, có thể là ý tưởng tốt để trích xuất nó thành một partial.

Khi muốn thay đổi, bạn chỉ cần sửa ở một nơi.

Ví dụ:

<%= render :form %>

Để hoạt động, bạn cần đặt tên file view bắt đầu bằng gạch dưới, như _form.erb, nhưng khi gọi render bạn không cần gạch dưới.

Bạn sẽ có thể truy cập biến instance từ partial...

Nhưng biến cục bộ thì sao?

Bạn có thể làm thế này:

<%= render :form, message: "Apples Are Good" %>

Điều này cho phép bạn truy cập message như một biến cục bộ trong partial.

Tiếp theo:

Bạn sẽ học cách render nhiều thứ chỉ với một lần gọi render!

Cách Render Collections

Partials giúp bạn render collections mà không cần vòng lặp.

Giả sử bạn đang render @books.

Bạn có thể làm thế này:

<%= render @books %>

Điều này sẽ hoạt động nếu bạn có partial _book.erb và dùng book làm biến bên trong template đó.

Ví dụ:

# app/views/books/_book.erb
<%= image_tag(book.cover) %>
<h4><%= book.title %></h4>
<%= book.author %>
<%= link_to "Read Book", book %>

Nếu bạn cần số thứ tự sách hiện tại (cho class CSS), bạn có thể dùng book_counter.

Ở đây book_ là tên model của bạn.

Tôi nghĩ collection rendering là một trong những tính năng Rails yêu thích của tôi!

Hiểu về Rails Layouts

Khi bạn tạo ứng dụng Rails mới, nó có thư mục "layouts" dưới thư mục views.

Ở đó bạn sẽ tìm thấy file application.html.erb.

Đó là layout mặc định!

Layout là gì?

Layout cho phép bạn tạo giao diện nhất quán cho trang web.

Nó bao gồm:

  • Menu
  • Footer
  • Tải file CSS & Javascript...

Phần lớn thời gian layout mặc định là ổn.

Nhưng nếu bạn muốn layout khác cho một trang cụ thể thì sao?

Bạn có thể dùng tùy chọn layout.

Ví dụ:

render :index, layout: 'admin'

Bạn có thể tắt layout:

render :index, layout: false

Và bạn có thể thiết lập layout ở cấp controller.

Như sau:

class AdminsController < ApplicationController
  layout 'admin'
end

Rendering không kết thúc Action

Một điểm thường gây nhầm lẫn là nghĩ rằng rendering (và redirecting) bên trong action controller sẽ dừng chạy code phía sau nó.

Bạn có thể gặp vấn đề này nếu gọi render nhiều lần.

Ví dụ:

def create
  if yellow_fruit?
    render :bananas
  end
  render :apples
end

Điều này sẽ gây lỗi vì render :apples luôn chạy và bạn không thể render hai lần trong cùng một action controller.

Giải pháp:

def create
  if yellow_fruit?
    render :bananas
  else
    render :apples
  end
end

Một lựa chọn khác là dùng từ khóa return sau render, nhưng để rõ ràng, tốt nhất tránh dùng return ở giữa phương thức khi có thể.

Tóm tắt

Bạn đã học về chủ đề quan trọng là rendering trong Ruby on Rails.

Rendering cho phép bạn trả về nội dung cho người dùng ứng dụng và là một trong những bước cuối cùng bên trong action controller. Hiểu về rendering giúp bạn viết ứng dụng Rails tốt hơn.

Bây giờ đến lượt bạn, hãy mở trình soạn thảo và thực hành kỹ năng coding.

Cảm ơn bạn đã đọc!