12/08/2018, 12:33

Sử dụng layout trong ruby on rails

1. Giới thiệu Layout được sử dụng phổ biến nhằm giảm bớt sự lặp lại của các đoạn code view dùng chung. Mô hình thông thường của layout có dạng: <%= render "shared/header" %> Hello World <%= render "shared/footer" %> Tuy nhiên mô hình này khá dài dòng và khó khăn trong ...

1. Giới thiệu

  • Layout được sử dụng phổ biến nhằm giảm bớt sự lặp lại của các đoạn code view dùng chung. Mô hình thông thường của layout có dạng:
 <%= render "shared/header" %>
      Hello World
 <%= render "shared/footer" %>
  • Tuy nhiên mô hình này khá dài dòng và khó khăn trong việc thay đổi cấu trúc của các file render. Với mô hình thứ 2, bạn có thể sử dụng một cấu trúc chung cho header và footer và chỉ thay đổi nội dung content:
 # The header part of this layout
 <%= yield %>
 # The footer part of this layout
  • Khi đó, trang nội dung của bạn chỉ cần có dạng:
 hello world
  • Nội dung được sẽ được tự động insert vào layout, kết quả thu được sẽ là:
 # The header part of this layout
 hello world
 # The footer part of this layout

2. Cách sử dụng layout

2.1. Layout và yield

  • Có thể sử dụng nhiều phần yield với tên khác nhau trong cùng một layout như sau:
<html>
      <head>
        <%= yield :head %>
      </head>
      <body>
        <%= yield %>
      </body>
</html>
  • Khi đó, cần sử dụng content_for để thay đổi nội dung trong các yield đó:
<% content_for :head do %>
      <title>A simple page</title>
<% end %>
<p>Hello, Rails!</p>
  • Kết quả thu được sẽ có dạng:
<html>
      <head>
        <title>A simple page</title>
      </head>
      <body>
        <p>Hello, Rails!</p>
      </body>
</html>

2.2. Render partial

  • Một cách khác, bạn có thể sử dụng partial để đơn giản hóa file view của mình với các file partial có dạng _footer.html.erb sẽ được render trong view 1 cách dễ dàng cùng với các biến local:
<%= render partial: "footer", locals: {zone: @zone} %>

hoặc có thế được viết một cách ngắn gọn:

<%= render "footer", zone: @zone %>
  • Tương tự, bạn cũng có thể sử dụng layout cho partial như sau:
<%= render partial: "link_area", layout: "graybar" %>
  • Trong trường hợp bạn sử dụng partial trùng với tên của partial thì bạn có thể sử dụng object trong render theo định dạng:
<%= render partial: "customer", object: @new_customer %>
  • Khi render một instance của model, bạn có thể sử dụng cú pháp rút gọn sau:
<%= render @customer %>

2.3. Render collection

  • Không những vậy, việc sử dụng partial còn rất hữu dụng trong trường hợp render collections. Trường hợp thông dụng nhất thường gặp là render một list các partial:
 <%= render partial: "product", collection: @products %>
  • Nếu @products là collection của instance product thì có thể viết theo cú pháp rút gọn:
 <%= render @products %>
  • Cũng có thể sử dụng cú pháp render này cho một collection của các instance khác nhau như sau:
 <%= render [customer1, employee1, customer2, employee2] %>

Với customer và employee là instance của model Customer và Employee.

  • Một cách khác, có thể render collection như những biến cục bộ và có thể kèm theo các biến khác:
 <%= render partial: "product", collection: @products,
           as: :item, locals: {title: "Products Page"} %>
  • Đặc biệt, có thể chèn thêm các partial khác vào giữa các instance của collection:
<%= render partial: @products, spacer_template: "product_ruler" %>

Hoặc sử dụng layout riêng cho các partial:

<%= render partial: "product", collection: @products,
			layout: "special_layout" %>

3. Kết luận

Trên đây tôi đã giới thiệu sơ lược về layout và các cách sử dụng trong các trường hợp cụ thể. Hi vọng bài viết giúp các bạn có được cái nhìn tổng quát về cách sử dụng layout trong Ruby on Rails. Cảm ơn đã theo dõi!

0