2012-02-07 26 views
9

Trong ray 3.0 với HAML (3.1.4) Tôi cócontent_for vs năng suất trong partials

  1. một số mẫu giống như phần, như _template.html.haml:

    .panel.top 
        = yield :panel_top 
    
    .content 
        = yield 
    
  2. một số khác một phần sẽ được hiển thị bằng cách sử dụng mẫu ưu tiên (tất cả nội dung này được hiển thị bằng AJAX, nhưng điều này không quan trọng)

    - content_for :panel_top do 
    .title.left 
        = title 
    
    content text 
    

và điều này đã làm việc như một nét duyên dáng trong Rails 3,0

Nhưng, sau khi nâng cấp lên 3.2 này không thành công! Yiels chỉ mang lại "nội dung văn bản", vì vậy tôi có "nội dung văn bản" hai lần và không có tiêu đề ở tất cả

chỉ thay đổi = yield :panel_top để = content_for :panel_top công trình cho 3,2

Tôi không chắc chắn rằng giải pháp này là ok, và nếu nó ổn định hoặc được đề xuất, tôi không thể tìm thấy bất kỳ ghi chú nào về các thay đổi trong chế biến yield cũng như trong ghi chú phát hành Rails 3.1, cũng như không ghi chú trong 3.2.

Bạn có thể giúp cách tốt nhất để tổ chức yield ing bên trong partials không?

Trả lời

10

Từ Rails 3.0 để Rails 3.2 content_for đã thực sự thay đổi:

3,0:

def content_for(name, content = nil, &block) 
    content = capture(&block) if block_given? 
    @_content_for[name] << content if content 
    @_content_for[name] unless content 
end 

3,2:

def content_for(name, content = nil, &block) 
    if content || block_given? 
    content = capture(&block) if block_given? 
    @view_flow.append(name, content) if content 
    nil 
    else 
    @view_flow.get(name) 
    end 
end 

này cho chúng ta, mà từ 3.2 content_for công trình để hiển thị/chèn nội dung, không chỉ lưu trữ nội dung hoặc phần được đặt tên.

Ngoài ra, nếu bạn cố gắng gỡ lỗi yield logic bạn sẽ nhận được rằng nó sinh ra trước khi content_for được khởi tạo chính xác.

Vì vậy, để lại bộ nhớ đệm trong phần thảo luận này, tôi có thể kết luận rằng content_forthích hợp hơn cách chèn phần được đặt ở bất kỳ đâu ngoại trừ bố cục cấp cao nhất. Trong trình trợ giúp và các tình huống khác yield sẽ hiển thị kết quả sai.

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