2012-05-25 71 views
6

我正在嘗試使用yieldcontent_for創建一個動態內容。基本上我有一堆佈局。我不想爲每個佈局創建一堆視圖。我想在需要時渲染視圖部分。對於代碼的不同部分它是可以的。但是我對具有不同內容的相同部件有問題。傳遞參數以在Rails 3中生成(或有可能嗎?)

在我application.html.erb

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

在我show.html.erb我有;

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

這是問題;

如果我想多個name_section與不同的內容。我的意思是;我想用不同的內容在我看來把:name_section不同的地方。

對於ex;

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

任何想法?

謝謝。 Çağdaş

+0

他們爲什麼需要同名?當然,紅寶石確實有魔力,但確實能讀懂頭腦。 – drhenner

+0

與不同的名字我不得不復制我的代碼。但我想我與幫手解決了這個問題。無論如何感謝您的迴應。 –

+0

不要忘記沒有重複的代碼和單一的責任都很重要 – drhenner

回答

2

以下解決方案對我來說效果很好。它不允許你傳遞參數,但是如果在調用content_for(第二次)之前,將參數分配給實例變量,這允許你在content_for中引用實例變量。基本思想是content_for在第一次調用內容時生成內容,然後該內容保持靜態,但是此解決方法會延遲靜態內容生成,直到您準備好顯示內容爲止。

首先,這個功能添加到您的幫助模塊:然後

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 

,假設你想傳遞給arg1content_for。現在你可以這樣做:在你的代碼

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

然後,以後,在你的定義arg1

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

它在意義上的黑客,我不能保證的immediate_content_for的行爲在所有其他方面與content_for相同,並且如果content_for的行爲在某些未來版本的導軌中發生變化,則如果您想要繼續鏡像content_for,則需要更新immediate_content_for。儘管這不是一個最佳解決方案,但它現在完成了這項工作。

相關問題