2012-05-25 3 views
6

yieldcontent_for으로 동적 내용을 만들려고합니다. 기본적으로 레이아웃이 많습니다. 그리고 나는 각 레이아웃에 대한 뷰를 많이 만들고 싶지 않습니다. 뷰 파트가 필요할 때 렌더링하려고합니다. 코드의 다른 부분에 대해서는 괜찮습니다. 그러나 나는 다른 내용으로 동일한 부분에 문제가있다. 내 application.html.erb레일 3에 들어갈 매개 변수 전달 (또는 가능합니까?)

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

에서 그리고 내 show.html.erb에서

내가있다;

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

여기에 질문이 있습니다;

다른 내용으로 여러 개의 name_section을 원할 경우 어떻게됩니까? 내말은; 다른 내용으로 내보기의 다른 장소에 :name_section을 입력하고 싶습니다.

예 :

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

아이디어가 있으십니까?

감사합니다. 문서 감안할 때 Çağdaş

+0

왜 같은 이름이 필요합니까? 확실한 루비는 마술을하지만 마음을 읽습니다. – drhenner

+0

다른 이름으로 내 코드를 복제해야합니다. 하지만 나는이 문제를 도우미들과 함께 해결한다고 생각합니다. 어쨌든 응답 주셔서 감사합니다. –

+0

코드를 복제하지 말고 하나의 책임이 모두 중요하다는 것을 잊지 마십시오. – drhenner

답변

2

다음 해결책은 나를 위해 잘 작동했습니다. args를 전달할 수는 없지만 content_for (두 번째로)을 호출하기 전에 args를 인스턴스 변수에 할당하면 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 

을 그런 다음 content_forarg1을 통과한다고 가정합니다. 이제이 작업을 수행 할 수 있습니다

<% 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을 업데이트해야합니다. 최적의 솔루션은 아니지만 지금은 그 일을합니다.

6

나는 당신을 위해 무엇을 요구 한 것은 지금 가능하다고 믿는다에서

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

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

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

는 희망이 다른 사람 같은 솔루션을 찾는 데 도움이됩니다.

+0

대단히 감사합니다! :) –