2015-01-07 13 views
25

Tôi đã xem chức năng trợ giúp chế độ xem "cung cấp" ngay hôm nay. Bằng cách nhìn vào hướng dẫn sử dụng của nó, tôi vẫn còn bối rối về cách nó khác với "content_for".Ruby on Rails: cung cấp vs content_for

cung cấp (tên, nội dung = nil, & khối)

Giống như content_for nhưng khi được sử dụng với bừng luồng thẳng trở lại cách bố trí. Nói cách khác, nếu bạn muốn ghép nối một số lần với cùng một bộ đệm khi hiển thị mẫu nhất định, bạn nên sử dụng content_for, nếu không, hãy sử dụng cung cấp để cho bố cục dừng lại tìm kiếm thêm nội dung.

Câu hỏi 1: điều này khá trừu tượng đối với tôi - bất kỳ ai có thể ăn thịt bằng cách đưa ra ví dụ minh họa?

Câu hỏi 2: làm việc với đường ống nội dung, hoạt động tốt hơn và lý do tại sao?

Cảm ơn!

+2

Bạn có quen thuộc với http://api.rubyonrails.org/classes/ActionController/Streaming.html không? –

+0

Thành thật mà nói, không có trước khi bạn đề cập đến nó. Tôi chỉ nhìn vào ref bạn chia sẻ, và nó là tuyệt vời. Không bao giờ biết rằng theo mặc định Rails tải mẫu trước khi bố trí! Vì vậy, phát trực tuyến là cách để hoàn nguyên đơn đặt hàng này. Sau đó..? – Bruce

+0

Đó chỉ là cách nó được triển khai, lợi thế chính của phát trực tuyến là cho phép các phần của trang (đặc biệt là tiêu đề JS) được phát lại cho trình duyệt khi nó sẵn sàng, thay vì chờ toàn bộ trang. –

Trả lời

22

Trước hết, truyền phát là gì? Tại sao bạn sử dụng nó?

Phát trực tuyến là phương pháp hiển thị thay thế các trang từ trên xuống (bên ngoài). Hành vi hiển thị mặc định là từ trong ra ngoài. Streaming phải được kích hoạt trong điều khiển của bạn:

class MyController 
    def action 
    render stream: true # Streaming enabled 
    end 
end 

Theo documentation:

trực tuyến có thể được coi là quá mức cần thiết cho những hành động nhẹ như mới hoặc chỉnh sửa. Lợi ích thực sự của việc truyền trực tuyến là các hành động tốn kém , ví dụ, thực hiện rất nhiều truy vấn trên cơ sở dữ liệu.

Vì vậy, nếu bạn không sử dụng phát trực tuyến, vẫn còn có sự khác biệt?

Có.

Sự khác biệt là mẫu có thể xác định nhiều khối nội dung bằng cách gọi content_for nhiều lần.Làm như vậy sẽ nối các khối và thông qua đó để bố trí:

# layout.html.erb 
<div class="heading"><%= yield :surprise %></div> 
<div class="body"> 
    <p><%= yield %></p> 
    <p>But it's not very interesting...</p> 
</div> 

# template.html.erb 
<%= content_for :surprise, "Hello" %> 
I've got your content! 
<%= content_for :surprise, ", World!" %> 

# Generated HTML 
<div class="heading">Hello, World!</div> 
<div class="body"> 
    <p>I've got your content!</p> 
    <p>But it's not very interesting...</p> 
</div> 

Kể từ providekhông tiếp tục tìm kiếm các mẫu được cung cấp, chỉ có khối truyền cho provide cuộc gọi đầu tiên sẽ được gửi đến các mẫu:

# layout.html.erb 
<div class="heading"><%= yield :title %></div> 

# template.html.erb 
<%= provide :title, "Foo" %> 
<%= provide :title, "bar" %> 

# Generated HTML 
<div class="heading">Foo</div> 
+1

'cung cấp' cũng * nối thêm * nội dung trong' view_flow'. cách duy nhất để ghi đè nội dung cho khóa là sử dụng 'content_for' với tùy chọn 'flush: true'. – mmtootmm

5

Đã tò mò muốn xem những gì khác biệt là, và như Thong Kuah chỉ vào api, bên trong câu trả lời:

Điều này có nghĩa rằng, nếu bạn có năng suất: Tiêu đề trong cách bố trí của bạn và bạn muốn sử dụng trực tuyến , bạn sẽ phải hiển thị toàn bộ mẫu (và cuối cùng kích hoạt tất cả các truy vấn) trước khi phát trực tuyến tiêu đề và tất cả các nội dung, sẽ giết mục đích phát trực tuyến. Vì lý do này Rails 3.1 giới thiệu một trình trợ giúp mới được gọi là cung cấp giống như content_for nhưng cho bố cục ngừng tìm kiếm các mục nhập khác và tiếp tục hiển thị.