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.
[/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]