Layouts – czyli układy graficzne

Znaczenia słowa layout:

Rails Guides, Layouts and Rendering in Rails – This guide covers the basic layout features of Action Controller and Action View.

Layout dla aplikacji

Layout dla aplikacji umieszczamy w pliku app/views/layouts/application.html.erb. To jest domyślny layout nowej aplikacji Rails (po małym liftingu + pl, utf-8):

<!doctype html>
<html lang="pl">
<head>
  <meta charset="utf-8">
  <title>Fortunka</title>
  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>
  <%= yield %>
</body>
</html>

A taki, dla porównania, jest domyślny layout z nifty:layout:

<!doctype html>
<html lang="pl">
  <head>
    <meta charset="utf-8">
    <title><%= h(yield(:title) || "Untitled") %></title>
    <%= stylesheet_link_tag 'application' %>
    <%= yield(:head) %>
  </head>
  <body>
    <div id="container">
      <%- flash.each do |name, msg| -%>
        <%= content_tag :div, msg, :id => "flash_#{name}" %>
      <%- end -%>

      <%- if show_title? -%>
        <h1><%=h yield(:title) %></h1>
      <%- end -%>

      <%= yield %>
    </div>
  </body>
</html>

Generator ten w pliku app/helpers/layout_helper.rb dodaje kilka użytecznych metod:

module LayoutHelper
  def title(page_title, show_title = true)
    @content_for_title = page_title.to_s
    @show_title = show_title
  end
  def show_title?
    @show_title
  end
  def stylesheet(*args)
    content_for(:head) { stylesheet_link_tag(*args) }
  end
  def javascript(*args)
    content_for(:head) { javascript_include_tag(*args) }
  end
end

Zobacz też Xac Stegner, Rails-3-HTML5-Boilerplate.

Aktywne zakładki

Dla przykładu, przyjmijmy, że na każdej stronie naszej aplikacji wyświetlamy trzy zakładki Homepage, About us oraz Contact, a kod elementu HTML z zakładkami, gdy jesteśmy na stronie Homepage ma wyglądać tak:

<div id="mainMenu">
  <ul>
    <li class="active"><a href="/home">Homepage</a></li>
    <li><a href="/about">About us</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
</div>

czyli element listy ul z linkiem do strony na której aktualnie jesteśmy powinien mieć dodany atrybut class ustawiony na active.

A tak chcielibyśmy, to wpisać layoucie views/layouts/application.html.erb:

<div id="mainMenu">
  <%= navigation ['/home','Homepage'],['/about','About us'],['/contact','Contact'] %>
</div>

Poniższy kod, po wpisaniu w helpers/layout_helper.rb, realizuje takie podejście:

def navigation(*data)
  content_tag :ul do
    data.map do |link, name|
      content_tag :li, link_to("#{name}", link),
          :class => ("active" if controller.controller_name == link[1,link.length])
    end
  end
end

Gotowy przykład, zob. labs/003-Tabbed_Navigation.

Na koniec kilka linków na ten temat:

Zagnieżdzone layouty z content_for

W powyższym przykładzie każdy z kontrolerów:

używa tego samego layoutu – application.html.erb.

Przypuśćmy, że layouty dla kontrolerów muszą się nieco różnić, dla przykładu – kolorem tła.

Zamiast powielenia i edycji layouts/application.html.erb można postąpić tak. Tworzymy plik layouts/about.html.erb o zawartości:

<% content_for :head do %>
  <style>
    #background { background-color: #956E6F; }
  </style>
<% end -%>
<%= render :file => 'layouts/application' %>

i według tego schematu tworzymy plik layouts/contact.html.erb.

What is sitemaps and why make a good use of that?

Odpowiedzi udzielił stJhimy.

Przykładowy plik:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://sinatra.local/rails3/</loc>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>http://sinatra.local/rails3/fortunes/1</loc>
    <priority>1.0</priority>
  </url>
</urlset>

Taki plik wygenerujemy korzystając z XMLbuilder:

xml.instruct!
xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do

  xml.url do
    xml.loc "http://sinatra.local/fortunes" # wstawiamy swój adres
    xml.priority 1.0
  end
  # dodajemy wszystkie fortunki (wystarczyłby indeks)
  @fortunes.each do |fortune|
    xml.url do
      xml.loc fortune_url(fortune)
      xml.priority 1.0
    end
  end
  # można dodać więcej linków, dla przykładu
  @posts.each do |post|
    xml.url do
      xml.loc post_url(post)
      xml.lastmod post.updated_at.to_date
      xml.priority 0.61
    end
  end
end

Wcześniej definiujemy @fortunes i dodajemy routing, np.

http://sinatra.local/fortunes/sitemap.xml

Na koniec uaktywnaimy sitemap dopisując w pliku public/robots.txt:

Sitemap: http://sinatra.local/fortunes/sitemap.xml

Albo wykonujemy ping:

www.google.com/webmasters/tools/ping?sitemap=http://sinatra.local/fortunes/sitemap.xml