2010-10-06 46 views
6

Tôi có bố cục ứng dụng chính, nhưng sau đó tôi có một phần/tài khoản trên trang web của tôi có bố cục chính xác như bố cục ứng dụng theo cách thủ công, ngoại trừ các trang/tài khoản có thêm thanh bên trong khu vực nội dung của bố cục.Mở rộng bố cục hiện tại trong Rails

Thay vì sao chép một cách ngắn gọn bố cục ứng dụng và tạo bố cục "tài khoản" gần như thừa, tôi muốn mở rộng bố cục ứng dụng, thêm thanh bên trong khu vực nội dung.

Vì vậy, tôi có một cái gì đó như thế này trong cách bố trí ứng dụng của tôi:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

và tôi muốn

<html> 
<body> 

<div id="content"> 

    <div id="sidebar"></div> 

    <%= yield %> 

</div> 

</body> 
</html> 

Có cách nào để thực hiện điều này mà không cần sao chép mã?

Trả lời

3

Nếu tuyến đường tài khoản/bạn đang bị ràng buộc để điều khiển tài khoản, bạn luôn có thể có một bố cục fullfeatured với phần điều kiện như thế này

render :template => "/shared/sidebar" if controller.controller_name == "account" 

(Tôi phải thừa nhận rằng nó không hài lòng mắt mặc dù)

4

Thường thì bạn sẽ có tình huống tương tự đối với các phần khác của trang web trong trường hợp đó, bạn nên sử dụng bố trí lồng nhau.

http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts

+0

Hãy chắc chắn kiểm tra [các phiên bản sau] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts) của cùng một tài liệu. Có những thay đổi trong phiên bản mới hơn của Rails và ví dụ được liên kết có thể không hoạt động nữa. –

5

Bạn có thể có nhiều hơn một yield trong một bố cục, chỉ cần cung cấp cho những người có thêm một cái tên:

<html> 
<body> 
    <div id="content"> 
    <%= yield :sidebar %> 
    <%= yield %> 
    </div> 
</body> 
</html> 

Bạn có thể thêm HTML cho yield rằng bằng content_for phương pháp

<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

Nhưng bạn sẽ phải thêm điều đó vào mỗi chế độ xem bạn muốn có thanh bên. Thay vào đó, tạo views/layouts/application_with_sidebar.html.erb

<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

Further reading

Nếu bạn muốn giữ số lượng yield s ở mức tối thiểu, bạn có thể làm tổ bố trí của bạn để thay thế.

views/layouts/application.html.erb

<html> 
<body> 
    <div id="content"> 
    <%= yield(:with_sidebar) or yield %> 
    </div> 
</body> 
</html> 

views/layouts/application_with_sidebar.html.erb

<% content_for :with_sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

controllers/accounts_controller.rb

class AccountsController < ApplicationController 
    layout 'application_with_sidebar' 
    ... 
end 
+0

Sau đó, tôi sẽ ném các biến vào bố cục chính, toàn cục không áp dụng cho tất cả các phần của trang web.Chỉ cần không cảm thấy đúng. Cảm ơn ý tưởng. –

+0

@ Bố cục lồng nhau như @mark được đề xuất có lẽ là giải pháp thay thế tốt nhất, sau đó. Tất cả phụ thuộc vào mức độ thường xuyên bạn cần đánh dấu này để hiển thị. –

Các vấn đề liên quan