2012-05-25 29 views
6

Tôi đang cố tạo nội dung động với yieldcontent_for. Về cơ bản tôi có nhiều bố trí. Và tôi không muốn tạo ra nhiều lượt xem cho mỗi bố cục. Tôi muốn hiển thị các phần xem khi cần. Đối với các phần khác nhau của mã nó là ok. Nhưng tôi có vấn đề với cùng một phần với nội dung khác nhau.Truyền tham số để sinh lời trong Rails 3 (hoặc có thể không?)

trong tôi application.html.erb

<%= yield %> 
<%= yield :name_section %> 

Và trong show.html.erb của tôi có;

<% content_for :name_section do %> 
    <b>Name:</b> 
    <%= @post.name %> 
<% end %> 

Đây là câu hỏi;

Điều gì sẽ xảy ra nếu tôi muốn đặt tên nhiều tên với các nội dung khác nhau. Ý tôi là; Tôi muốn đặt :name_section các địa điểm khác nhau theo quan điểm của tôi với nội dung khác nhau.

Ví dụ;

<table> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
</table> 

Bất kỳ ý tưởng nào?

Cảm ơn bạn. Cagdas

+0

tại sao họ cần cùng tên? Chắc chắn ruby ​​làm phép thuật nhưng nó đọc tâm trí. – drhenner

+0

với các tên khác nhau tôi phải sao chép mã của mình. nhưng tôi nghĩ rằng tôi giải quyết vấn đề này với những người giúp đỡ. cảm ơn cho phản ứng anyway. –

+0

đừng quên không trùng lặp mã và trách nhiệm duy nhất là cả hai quan trọng – drhenner

Trả lời

2

Giải pháp sau đây đã làm việc tốt cho tôi. Nó không cho phép bạn vượt qua arg, nhưng nếu, ngay trước khi gọi content_for (lần thứ hai), bạn gán args của bạn cho các biến mẫu, điều này cho phép bạn tham chiếu các biến cá thể của bạn trong content_for. Ý tưởng cơ bản là content_for tạo nội dung khi được gọi là lần đầu tiên và nội dung đó sau đó vẫn tĩnh, nhưng cách giải quyết này làm chậm trễ việc tạo nội dung tĩnh cho đến khi bạn sẵn sàng hiển thị nội dung.

Đầu tiên, thêm chức năng này để mô-đun helper của bạn:

def immediate_content_for name, content = nil, &block 
    @immediate_content ||= {} 
    if content || block_given? then 
    @immediate_content[name] = Proc.new { content_for name, content, &block } 
    nil 
    else 
    @immediate_content[name].call 
    content_for name 
    end 
end 

Sau đó, giả sử bạn muốn vượt qua arg1 để content_for. Bây giờ bạn có thể làm điều này:

<% content_for :my_form %> 
    <%= some_helper_function(@arg1) %> 
<% end %> 

Sau đó, sau này trong mã của bạn, sau khi bạn định nghĩa arg1:

<%= @arg1 = arg1 %> 
<%= content_for :my_form %> 

Đó là một hack theo nghĩa là tôi không thể đảm bảo rằng hành vi của immediate_content_for là theo cách khác giống với cách của content_for và nếu hành vi của content_for thay đổi trong một số phiên bản đường ray trong tương lai, bạn cần phải cập nhật immediate_content_for nếu bạn muốn tiếp tục phản ánh content_for. Mặc dù nó không phải là một giải pháp tối ưu, nó hiện công việc.

6

Tôi tin rằng những gì bạn đã yêu cầu bây giờ có thể:

# The template 
<%= render layout: "my_layout" do |customer| %> 
    Hello <%= customer.name %> 
<% end %> 

# The layout 
<html> 
    <%= yield Struct.new(:name).new("David") %> 
</html> 

Từ: http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

Hy vọng rằng đây sẽ giúp người khác tìm kiếm các giải pháp tương tự.

+0

tuyệt vời, cảm ơn cho điều đó! :) –