session[]
Hash angeboten. Von Rails
wird dabei automatisch für jeden neuen Besucher der Webseite eine neue
Session angelegt. Diese wird per Default als Cookie (siehe Abschnitt 8.1, „Cookies“) gespeichert und unterliegt damit der Begrenzung auf
4 kB. Man kann die Sessions aber auch in der Datenbank speichern (siehe
„Sessions in der Datenbank
speichern“). Eine eigenständige und eindeutige
(unique) Session-ID wird automatisch erstellt und der Cookie wird per
Default beim Schließen des Webbrowsers gelöscht./public
aufrufen, so läuft das außerhalb des
Session-Managements.MacBook:~ xyz$ rails new breadcrumbs [...] MacBook:~ xyz$ cd breadcrumbs MacBook:breadcrumbs xyz$ rails generate controller Home ping pong index [...] MacBook:breadcrumbs xyz$
@breadcrumbs,
um die Werte im View sauber abrufen zu
können. Dazu richten wir einen before_filter
in
der app/controllers/home_controller.rb
ein:class HomeController < ApplicationController before_filter :set_breadcrumbs def ping end def pong end def index end private def set_breadcrumbs @breadcrumbs = session[:breadcrumbs] @breadcrumbs ||= Array.new @breadcrumbs.push(request.url) @breadcrumbs.shift if @breadcrumbs.count > 3 session[:breadcrumbs] = @breadcrumbs end end
app/views/layouts/application.html.erb
, um diese
letzten Einträge am Kopf jeder Seite anzuzeigen:<!DOCTYPE html>
<html>
<head>
<title>Breadcrumbs</title>
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
</head>
<body>
<% if @breadcrumbs %>
<p>Letzte Seitenaufrufe:</p>
<ul>
<% @breadcrumbs.each do |breadcrumb| %>
<li><%= link_to breadcrumb, breadcrumb %></li>
<% end %>
</ul>
<% end %>
<%= yield %>
</body>
</html>
http://0.0.0.0:3000/home/ping
,
http://0.0.0.0:3000/home/ping
oder http://0.0.0.0:3000/home/index
surfen und oben immer sehen, auf welchen Seiten Sie vorher waren.
Natürlich geht das erst auf der zweiten Seite, weil Sie beim ersten
Aufruf ja noch keine Historie haben.MacBook:breadcrumbs xyz$ rails generate controller Home reset -s
skip app/controllers/home_controller.rb
route get "home/reset"
invoke erb
exist app/views/home
create app/views/home/reset.html.erb
invoke test_unit
skip test/functional/home_controller_test.rb
invoke helper
identical app/helpers/home_helper.rb
invoke test_unit
identical test/unit/helpers/home_helper_test.rb
invoke assets
invoke coffee
identical app/assets/javascripts/home.js.coffee
invoke scss
identical app/assets/stylesheets/home.css.scss
MacBook:breadcrumbs xyz$
app/controllers/home_controller.rb
sieht dann so
aus:class HomeController < ApplicationController
before_filter :set_breadcrumbs
def ping
end
def pong
end
def index
end
def reset
reset_session
@breadcrumbs = nil
end
private
def set_breadcrumbs
@breadcrumbs = session[:breadcrumbs]
@breadcrumbs ||= Array.new
@breadcrumbs.push(request.url)
@breadcrumbs.shift if @breadcrumbs.count > 3
session[:breadcrumbs] = @breadcrumbs
end
end
http://0.0.0.0:3000/home/reset
die aktuelle Session löschen.reset_session
aufzurufen, sondern auch noch die Instanz-Variable
@breadcrumbs
auf nil
zu setzen. Sonst
würden im View doch noch die alten Breadcrumbs erscheinen.config/initializers/session_store.rb
. Wir
kommentieren den :cookie_store
aus und nehmen das
Kommentarzeichen vor dem :active_record_store
heraus.# Be sure to restart your server when you modify this file. # Breadcrumbs::Application.config.session_store :cookie_store, key: '_breadcrumbs_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rails generate session_migration") Breadcrumbs::Application.config.session_store :active_record_store
MacBook:breadcrumbs xyz$ rails generate session_migration invoke active_record create db/migrate/20120530145134_add_sessions_table.rb MacBook:breadcrumbs xyz$ rake db:migrate == AddSessionsTable: migrating =============================================== -- create_table(:sessions) -> 0.0014s -- add_index(:sessions, :session_id) -> 0.0005s -- add_index(:sessions, :updated_at) -> 0.0006s == AddSessionsTable: migrated (0.0027s) ====================================== MacBook:breadcrumbs xyz$