2012-05-25 9 views
6

yield ve ile dinamik içerik oluşturmaya çalışıyorum. Temelde bir sürü düzenim var. Ve her bir düzen için görünüm gruplarını oluşturmak istemiyorum. İhtiyaç duyulduğunda parçaları görüntülemek istiyorum. Kodun farklı bölümleri için sorun yok. Ama farklı içeriklerle aynı parçalarda sorunum var. Benim application.html.erbGeçiş Parametrelerini Rails 3'te vermek için (ya da mümkün mü?)

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

yılında Ve show.html.erb yılında

i var;

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

İşte soru;

Farklı içeriğe sahip birden fazla ad_sayı yapmak istersem ne olur? Demek istediğim; Farklı içeriklerle görünümümde :name_section farklı yer açmak istiyorum.

Örn;

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

Herhangi bir fikir?

Teşekkür ederiz. dokümantasyon Verilen Çağdaş

+0

Neden aynı ada sahipler? Elbette yakut sihir yapar ama zihinleri okur. Farklı isimlerle – drhenner

+0

kodumu çoğaltmam gerekiyor. ama sanırım bu sorunu yardımcılarla çözüyorum. Yine de cevap için teşekkürler. –

+0

kod çoğaltmak değil unutmayın ve tek sorumluluk hem de önemli – drhenner

cevap

2

Aşağıdaki çözüm benim için güzel çalıştı. Bu, args iletmenize izin vermez, ancak content_for (ikinci kez) aramadan hemen önce, hatalarınızı örnek değişkenlerine atarsanız, bu, örnek değişkenlerinize content_for içinde başvurmanızı sağlar. Temel fikir, content_for'un içeriği 1. kez çağrıldığında oluşturması ve bu içeriğin statik kalmasıdır, ancak bu geçici çözüm, içeriği görüntülemeye hazır olana kadar statik içerik oluşturmayı geciktirir.

İlk olarak, yardımcı modülüne bu işlevi ekleyin:

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 

Sonra content_for için arg1 geçmek istediğinizi varsayalım. Artık bunu yapabilirsiniz:

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

Sonra daha sonra kodunuzda, sonra senin arg1 tanımlamıştır:

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

Ben immediate_content_for davranış olduğunu garanti edemez anlamda bir hack var content_for ile tamamen aynı şekilde ve content_for davranışı, rayların gelecek sürümlerinde değişiyorsa, content_for yansıtma işlemine devam etmesini isterseniz, immediate_content_for güncelleştirmeniz gerekir. En uygun çözüm olmasa da, şu an için iş yapıyor.

İlgili konular