2012-05-25 7 views
6

Próbuję utworzyć dynamiczną zawartość za pomocą yield i content_for. Zasadniczo mam garść układów. I nie chcę tworzyć garści widoków dla każdego układu. Chcę renderować części, gdy są potrzebne. Dla różnych części kodu jest OK. Ale mam problem z tymi samymi częściami o różnej zawartości.Przekazywanie parametrów do wydajności w Railsach 3 (lub jest to możliwe?)

w moim application.html.erb

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

I w moim show.html.erb mam;

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

Oto pytanie;

Co zrobić, jeśli chcę podać wiele sekcji name_section z inną zawartością. Mam na myśli; Chcę umieścić :name_section różnych miejsc w moim widoku z inną zawartością.

Na przykład;

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

Jakieś pomysły?

Dziękuję. Çağdaş

+0

dlaczego potrzebują tego samego imienia? Jasne ruby ​​czynią magię, ale czytają umysły. – drhenner

+0

o różnych nazwach muszę powielić mój kod. ale myślę, że rozwiązuję ten problem z pomocą. dzięki za odpowiedź. –

+0

Nie zapomnij, że powielanie kodu i pojedyncza odpowiedzialność są ważne. – drhenner

Odpowiedz

2

Poniższe rozwiązanie dobrze się sprawdziło. Nie pozwala na przekazywanie argumentów, ale jeśli, tuż przed wywołaniem content_for (po raz drugi), przypiszemy argumenty do zmiennych instancji, co pozwala na odwoływanie się do zmiennych instancji w content_for. Podstawową ideą jest, że content_for generuje zawartość, gdy jest wywoływana po raz pierwszy i że treść pozostaje wtedy statyczna, ale to obejście opóźnia generowanie zawartości statycznej, dopóki nie będziesz gotowy do wyświetlenia zawartości.

pierwsze, dodać tę funkcję do modułu pomocniczego:

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 

Następnie załóżmy, że chcesz przekazać arg1 do content_for. Teraz można to zrobić:

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

Następnie, później w kodzie, po zdefiniowanymi arg1:

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

Jest to hack, w tym sensie, że nie mogę zagwarantować, że zachowanie immediate_content_for jest w inny sposób identyczny z content_for, a jeśli zachowanie content_for zmienia się w niektórych przyszłych wersjach szyn, musisz zaktualizować immediate_content_for, jeśli chcesz, aby kontynuował tworzenie kopii lustrzanej content_for. Chociaż nie jest to optymalne rozwiązanie, wykonuje teraz pracę.

Powiązane problemy