Jak wyświetlić kod utworzoną przy pomocy metody: content_tag

Witam,

W swoim szablonie chciałbym wyświetlić nawigację utworzoną przy pomocy helpera:
Utworzony kod:
Views/layouts/application.html.erb

... <%= yield :navigation %> ...
Helpers/layout_helper.rb

module LayoutHelper def navigation content_for :navigation do content_tag(:ul) do content_tag(:li) { link_to("Login", '#') } content_tag(:li) { link_to("Signup", '#') } end end end end
Gdzie powinienem poprawnie wywołać metodę navigation() aby wyświetlić jego zawartość na stronie ?
Gdy w szablonie wywołam metodę navigation():

<% navigation %> <%= yield :navigation %>
Otrzymuję tylko ostatni link zamiast wszystkich co jest poprawne według języka Ruby. Jednak ja chce wyświetlić wszystkie linki.

Troszkę przekombinowane to jest, moim zdaniem albo helper albo content_for w tym wypadku jest do użycia ale nie oba na raz.

content_for jest przydatny kiedy na różnych podstronach treść może być różna. Przykładowo, na stronie z listingiem artykułów ma wyświetlać najnowsze komentarze a na podstronie danego artykułu – listing 5 najnowszych.

Helper natomiast sprawdzi się gdzie chcesz jakoś inaczej sformatować wyświetlaną treść. Do nawigacji też ujdzie, ale ja po prostu bym to wsadził w partial w folderze app/views/layouts i tyle.

Jednak wole linki generować w helperze z tego względu że będą one tworzone dynamicznie np. w zależności od uprawnień itp…

w szablonie głównym dodałem kod:

... <%= render :partial => 'layouts/header' %> ...
Pytaie jak w szablonie _header.html.erb wywołać metodę helpera i wyświetlić linki z użyciem metody content_tag ?

Gdy napiszę:
layouts/_header.html.erb

[code]


<%= navigation %>
[/code] Helpers/layout_helper.rb [code]module LayoutHelper def navigation content_tag(:ul) do content_tag(:li) { link_to("Login", '#') } content_tag(:li) { link_to("Signup", '#') } end end end[/code] Widzę tylko ostatni link. Co zrobić aby wyświerlały się wszystkie linki w ten sposób?

Coś w stylu:

module LayoutHelper def navigation html = ''; html += content_tag(:ul) do html += content_tag(:li) { link_to("Login", '#') } html += content_tag(:li) { link_to("Signup", '#') } end html end end
odpada.

https://rails.lighthouseapp.com/projects/8994/tickets/4710-content_tag-isnt-rendering-blocks-correctly

Już trochę lepiej. W tej chwili kombinuje z

_header.html.erb

[code]


<%= navigation [‘Strona główna’, ‘/’], [‘Kontakt’, ‘/contact’] %>
[/code] layout_helper.rb [code]... def navigation(*items) content_tag(:ul) do items.each do |label, path| content_tag(:li, link_to(label, path)) end end end ...[/code] W tej chwili nie wiem jak w taki sposób wyświetlić wszystkie linki :( Gdy zrobie to tak: layout_helper.rb [code]... def navigation(*items) html = '' content_tag(:ul) do items.each do |label, path| html << content_tag(:li, link_to(label, path)) end end html end ...[/code] Na stronie widzę cały kod html. [code]
  • Strona główna
  • Kontakt
  • [/code]

    def navigation(*items) content_tag(:ul) do items.collect do |label, path| content_tag(:li, link_to(label, path)) end.join("") end end
    może tak?

    mam coś takiego ijak na razie działa :slight_smile:

    def navigation(*items) links = "" items.each do |label, path| links += content_tag(:li, link_to(label, path)) end content_tag(:ul, links.html_safe) end