<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>example/blog/views/flash.html</filename>
    </added>
    <added>
      <filename>priv/skel/views/flash.html</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -34,13 +34,13 @@ loop(Req) -&gt;
     %% {error,_} 
     case beepbeep:dispatch(Env) of
 	{render,View,Data} -&gt;
-	    {ok,Content} = render_template(View,Data),
+	    {ok,Content} = render_template(View,Data,Env),
 	    Req:respond({200,
 			 [{&quot;Content-Type&quot;,&quot;text/html&quot;}|[get_cookie(Env)]],
 			 Content});
 	{render,View,Data,Options} -&gt;
 	    {Status,ContentType,Headers} = extract_options(Options),
-	    {ok,Content} = render_template(View,Data),
+	    {ok,Content} = render_template(View,Data,Env),
 	    Req:respond({Status,
 			 [{&quot;Content-Type&quot;,ContentType}|[get_cookie(Env)|Headers]],
 			 Content});
@@ -60,9 +60,11 @@ loop(Req) -&gt;
 	    Req:respond({500,[],&quot;Server Error&quot;})
     end.
 
-render_template(ViewFile,Data) -&gt; 
+render_template(ViewFile,Data,Env) -&gt;
+    %% Copy flash into Data and clear from Session
+    Data1 = set_and_clear_flash(Data,Env),
     FullPathToFile = filename:join([blog_example_deps:local_path([&quot;views&quot;]),ViewFile]),
-    beepbeep:render_template(FullPathToFile,ViewFile,Data).
+    beepbeep:render_template(FullPathToFile,ViewFile,Data1).
 
 extract_options(Options) -&gt;
     {proplists:get_value(status,Options,200),
@@ -72,6 +74,13 @@ extract_options(Options) -&gt;
 get_cookie(Env) -&gt;
     mochiweb_cookies:cookie(?BEEPBEEP_SID,beepbeep_args:get_session_id(Env),[{path, &quot;/&quot;}]).
 
+set_and_clear_flash(Data,Env) -&gt;
+    case beepbeep_args:get_flash(Env) of
+	none -&gt; Data;
+	Flash -&gt;
+	    [{flash,Flash}|Data]
+    end.
+
 setup_session(Req,Env) -&gt;
     SessionKey = beepbeep_session_server:new_session(Req:get_cookie_value(?BEEPBEEP_SID)),
     beepbeep_args:set_session_id(SessionKey,Env).</diff>
      <filename>example/blog/src/blog_example_web.erl</filename>
    </modified>
    <modified>
      <diff>@@ -20,8 +20,20 @@ handle_request(&quot;new&quot;,[]) -&gt;
 handle_request(&quot;create&quot;,[]) -&gt;
     Title = beepbeep_args:get_param(&quot;post_title&quot;,Env),
     Body = beepbeep_args:get_param(&quot;post_body&quot;,Env),
-    blog_database:insert(Title,Body),
-    {redirect,&quot;/&quot;}.
+
+    %% Example of validation. Require a Title
+    if 
+	Title =:= undefined orelse length(Title) =:= 0 -&gt;
+	    %% Blank
+	    %% Set flash message for the template
+	    beepbeep_args:flash({notice,&quot;Title Required!&quot;},Env),
+	    {redirect,&quot;/home/new&quot;};
+	true -&gt;
+	    %% Set flash message for the template
+	    beepbeep_args:flash({notice,&quot;Post Created!&quot;},Env),
+	    blog_database:insert(Title,Body),
+	    {redirect,&quot;/&quot;}
+    end.
 
 %% Shows how to filter on certain actions in this controller
 before_filter() -&gt;</diff>
      <filename>example/blog/src/home_controller.erl</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,8 @@
 {% extends &quot;../base.html&quot; %}
 {% block content %}
- 
+
+{% include &quot;flash.html&quot; %}
+
 {% if data %} 
   {% for i in data %}
    &lt;h2&gt;{{ i.title }}&lt;/h2&gt;</diff>
      <filename>example/blog/views/home/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,8 @@
 {% extends &quot;../base.html&quot; %}
 {% block content %}
 
+{% include &quot;flash.html&quot; %}
+
 &lt;h2&gt;Add a Post&lt;/h2&gt; 
 &lt;form action=&quot;/home/create&quot; method=&quot;post&quot;&gt;
   Title:&lt;br/&gt; </diff>
      <filename>example/blog/views/home/new.html</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,9 @@ handle_request(&quot;index&quot;,[]) -&gt;
 handle_request(&quot;show&quot;,[Year]) -&gt;
     Sid = beepbeep_args:get_session_id(Env),
     Name = beepbeep_args:get_param(&quot;name&quot;,Env),
+
+    beepbeep_args:flash({notice,&quot;Example of a flash message between actions. See flash.html!&quot;},Env),
+    
     {render,&quot;home/show.html&quot;,[{year,Year},{sid,Sid},{name,Name}]}.
 
 </diff>
      <filename>priv/skel/src/home_controller.erl</filename>
    </modified>
    <modified>
      <diff>@@ -34,13 +34,13 @@ loop(Req) -&gt;
     %% {error,_} 
     case beepbeep:dispatch(Env) of
 	{render,View,Data} -&gt;
-	    {ok,Content} = render_template(View,Data),
+	    {ok,Content} = render_template(View,Data,Env),
 	    Req:respond({200,
 			 [{&quot;Content-Type&quot;,&quot;text/html&quot;}|[get_cookie(Env)]],
 			 Content});
 	{render,View,Data,Options} -&gt;
 	    {Status,ContentType,Headers} = extract_options(Options),
-	    {ok,Content} = render_template(View,Data),
+	    {ok,Content} = render_template(View,Data,Env),
 	    Req:respond({Status,
 			 [{&quot;Content-Type&quot;,ContentType}|[get_cookie(Env)|Headers]],
 			 Content});
@@ -60,9 +60,11 @@ loop(Req) -&gt;
 	    Req:respond({500,[],&quot;Server Error&quot;})
     end.
 
-render_template(ViewFile,Data) -&gt; 
+render_template(ViewFile,Data,Env) -&gt; 
+    %% Copy flash into Data and clear from Session
+    Data1 = set_and_clear_flash(Data,Env),
     FullPathToFile = filename:join([skel_deps:local_path([&quot;views&quot;]),ViewFile]),
-    beepbeep:render_template(FullPathToFile,ViewFile,Data).
+    beepbeep:render_template(FullPathToFile,ViewFile,Data1).
 
 extract_options(Options) -&gt;
     {proplists:get_value(status,Options,200),
@@ -72,6 +74,13 @@ extract_options(Options) -&gt;
 get_cookie(Env) -&gt;
     mochiweb_cookies:cookie(?BEEPBEEP_SID,beepbeep_args:get_session_id(Env),[{path, &quot;/&quot;}]).
 
+set_and_clear_flash(Data,Env) -&gt;
+    case beepbeep_args:get_flash(Env) of
+	none -&gt; Data;
+	Flash -&gt;
+	    [{flash,Flash}|Data]
+    end.
+
 setup_session(Req,Env) -&gt;
     SessionKey = beepbeep_session_server:new_session(Req:get_cookie_value(?BEEPBEEP_SID)),
     beepbeep_args:set_session_id(SessionKey,Env).</diff>
      <filename>priv/skel/src/skel_web.erl</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,7 @@
 {% extends &quot;../base.html&quot; %}
 {% block content %}
     Message is: {{ data }}
+    &lt;br/&gt;
+    &lt;br/&gt;
+    &lt;a href=&quot;/home/show/2009?name=dave&quot;&gt;Show more...&lt;/a&gt;
 {% endblock %}</diff>
      <filename>priv/skel/views/home/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,8 @@
 {% extends &quot;../base.html&quot; %}
 {% block content %}
+
+{% include &quot;../flash.html&quot; %}
+
 You choose year: {{ year }}
 &lt;p&gt;
   Session id: {{ sid }} </diff>
      <filename>priv/skel/views/home/show.html</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,10 @@
 	 get_session_data/2,
 	 get_all_session_data/1,
 	 get_action/1,
-	 set_action/2]).
+	 set_action/2,
+	 flash/2,
+	 get_flash/1]).
+
 -author('Dave Bryson &lt;http://weblog.miceda.org&gt;').
 
 %%
@@ -102,7 +105,33 @@ get_all_headers(Env) -&gt;
 %%
 get_param(Key,Env) -&gt;
     Params = proplists:get_value(&quot;beepbeep.data&quot;,Env),
-    proplists:get_value(Key,Params,&quot;?&quot;).
+    proplists:get_value(Key,Params).
+
+%%
+%% @doc Set a 'flash' message for use in your template. All flash message are wrapped in a List
+%% 
+flash(Term,Env) -&gt;
+    Flash = case get_session_data(beepbeep_flash,Env) of
+		undefined -&gt;
+		    [Term];
+		ExistingFlash -&gt;
+		    [Term|ExistingFlash]
+	    end,
+    set_session_data(beepbeep_flash,Flash,Env).
+
+
+%% Get and clear the flash
+get_flash(Env) -&gt;
+    Sid = get_session_id(Env),
+    case get_session_data(beepbeep_flash,Env) of
+	undefined -&gt;
+	    %% No flash data
+	    none;
+	Data -&gt;
+	    beepbeep_session_server:remove_session_data(Sid,beepbeep_flash),
+	    Data
+    end.
+
 
 %%
 %% @doc Get the current session id</diff>
      <filename>src/beepbeep_args.erl</filename>
    </modified>
    <modified>
      <diff>@@ -13,7 +13,7 @@
 
 -behaviour(gen_server).
 
--export([start/0,new_session/1,get_session_data/1,set_session_data/3,delete_session/1]).
+-export([start/0,new_session/1,get_session_data/1,set_session_data/3,delete_session/1,remove_session_data/2]).
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
 	 terminate/2, code_change/3]).
 
@@ -43,6 +43,9 @@ set_session_data(Sid,Key,Value) -&gt;
 delete_session(Sid) -&gt;
     gen_server:call(?MODULE,{delete_session,Sid}).
 
+remove_session_data(Sid,Key) -&gt;
+    gen_server:call(?MODULE,{remove_session_data,Sid,Key}).
+
 
 %%% Callbacks
 handle_call({new_session,Cookie}, _From, _State) -&gt;
@@ -87,6 +90,24 @@ handle_call({set_session_data,Sid,Key,Value},_From,_State) -&gt;
 
 handle_call({delete_session,Sid},_From,_State) -&gt;
     ets:delete(?MODULE,Sid),
+    {reply,ok,undefined};
+
+
+handle_call({remove_session_data,Sid,Key},_From,_State) -&gt;
+    Data = case ets:lookup(?MODULE,Sid) of
+	       [S] -&gt;
+		   S#beep_session.data;
+	       [] -&gt; []
+	   end,
+    Data1 = case proplists:is_defined(Key,Data) of
+		true -&gt;
+		    proplists:delete(Key,Data);
+		false -&gt;
+		    Data
+	    end,
+    
+    ets:insert(?MODULE,#beep_session{sid=Sid,data=Data1,ttl=0}),
+
     {reply,ok,undefined}.
 
 </diff>
      <filename>src/beepbeep_session_server.erl</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a5ab400e205c6bfac42a830132c0af5484e2e088</id>
    </parent>
  </parents>
  <author>
    <name>Dave Bryson</name>
    <email>daveb@miceda.org</email>
  </author>
  <url>http://github.com/davebryson/beepbeep/commit/3757f3c2cb4cf36cf8c0fa4665de687c67271386</url>
  <id>3757f3c2cb4cf36cf8c0fa4665de687c67271386</id>
  <committed-date>2009-05-15T14:02:47-07:00</committed-date>
  <authored-date>2009-05-15T14:02:47-07:00</authored-date>
  <message>added support for Rails like flash messages. See example blog</message>
  <tree>65d2da57aaba787e0b3c54db018a6eb22e040b1e</tree>
  <committer>
    <name>Dave Bryson</name>
    <email>daveb@miceda.org</email>
  </committer>
</commit>
