Hi All, I started out hashes intended to be populated with status info, e.g. sort_order, for several of my tables. I started ApplicationController with: session = {} tables = [:customers, :invoices, :payments] tables.each { |tbl| session[tbl] = {} } session[:tables] = tables Question 1: I had to include the initialization of session, for otherwise the assignment in the third line fails. But if Rails has a built-in ''session'' hash-like element, why is this assignment necessary. I checked that the above code worked by following it up with debugging code: logger.debug "Application tables:" nTables = session[:tables].length (0..(nTables-1)).each { |i| symTbl = session[:tables][i] objElement = session[symTbl] logger.debug "\t" + symTbl.to_s + " => " + objElement.inspect } The log showed that the three empty hashes were indeed created. I followed that up with a def show_session defined with a copy of the debugging code. When this method was subsequently invoked by some other controller, it crashed on the second line because session[:tables] was nil ... because session isn''t persistent, I believe. Any ideas on how to correct this situation? I read the two recent threads about sessions, but they don''t seem to address my problem. Thanks in Advance, Richard --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi~ On Oct 14, 2006, at 6:37 PM, Richard wrote:> > Hi All, > > I started out hashes intended to be populated with status info, e.g. > sort_order, for several of my tables. I started ApplicationController > with: > > session = {} > tables = [:customers, :invoices, :payments] > tables.each { |tbl| session[tbl] = {} } > session[:tables] = tablesIs this inside of a method in your application controller? Or is it just right in the class def? If its not inside of a method then the session is not in scope. You shoudl do this with a before_filter and a method: before_filter :setup_tables def setup_tables tables = [:customers, :invoices, :payments] tables.each { |tbl| session[tbl] = {} } session[:tables] = tables end Then it should work for you. -Ezra --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi Ezra, Your advice was a great boost forward. But I still have a problem. BTW, I''m running: WinXP-Pro/SP2, MySQL 5.0.15-nt, Ruby 1.8.2-15, Rails 1.1.4 SciTE 1.59, FireFox 1.2.0.7, Java JDK 1.5.0_06 I used the before_filter :setup_tables, :show_session That allowed my show_session to method to work both upon entry and exit from the ApplicationController''s instantiation. Show session also worked in app\controllers\MainController.rb#welcome However, it failed in app\views\main\welcome.rhtml with the error: ActionView::TemplateError (undefined local variable or method `show_session'' So I think I need to move it''s def to someplace higher than both controllers and views. How can I do that? Or should I make it a global function somehow? If you don''t mind an additional question, please give me your assessment of a rescue clause I added to show_session, as shown below. Thanks for your outstanding advice. Regards, Richard class ApplicationController < ActionController::Base before_filter :setup_tables, :show_session layout "base" logger.debug "===================================" logger.debug "Entering app\\controllers\\application.rb (top level)" logger.debug "===================================" def setup_tables tables = [:customers, :invoices, :payments] tables.each { |tbl| session[tbl] = {} } session[:tables] = tables end def show_session logger.debug "Application tables:" nTables = session[:tables].length (0..(nTables-1)).each { |i| symTbl = session[:tables][i] objElement = session[symTbl] logger.debug "\t" + symTbl.to_s + " => " + objElement.inspect } rescue raise "session[:tables] => nil" unless session[:tables] raise "nTables => #{nTables}" unless nTables != 3 raise "symTbl => nil for session[:tables][#{i}]" unless symTbl raise "objElement => nil for session[#{symTbl}]" unless objElement end protected def sort_clause(model, column, *order) [snip] end logger.debug "^^^^^^^^^^^^^^^^^^^^^^^" logger.debug "Leaving app\\controllers\\application.rb (top level)" logger.debug "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" end Ezra Zygmuntowicz wrote:> Hi~ > > On Oct 14, 2006, at 6:37 PM, Richard wrote: > > > > > Hi All, > > > > I started out hashes intended to be populated with status info, e.g. > > sort_order, for several of my tables. I started ApplicationController > > with: > > > > session = {} > > tables = [:customers, :invoices, :payments] > > tables.each { |tbl| session[tbl] = {} } > > session[:tables] = tables > > Is this inside of a method in your application controller? Or is it > just right in the class def? If its not inside of a method then the > session is not in scope. You shoudl do this with a before_filter and > a method: > > before_filter :setup_tables > > > def setup_tables > tables = [:customers, :invoices, :payments] > tables.each { |tbl| session[tbl] = {} } > session[:tables] = tables > end > > Then it should work for you. > > -Ezra--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi~ On Oct 15, 2006, at 2:18 PM, Richard wrote:> > Hi Ezra, > > Your advice was a great boost forward. But I still have a problem. > > BTW, I''m running: > WinXP-Pro/SP2, MySQL 5.0.15-nt, Ruby 1.8.2-15, Rails 1.1.4 > SciTE 1.59, FireFox 1.2.0.7, Java JDK 1.5.0_06 > > I used the before_filter :setup_tables, :show_session That allowed my > show_session to method to work both upon entry and exit from the > ApplicationController''s instantiation. > > Show session also worked in app\controllers\MainController.rb#welcome > > However, it failed in app\views\main\welcome.rhtml with the error: > ActionView::TemplateError (undefined local variable or method > `show_session'' > > So I think I need to move it''s def to someplace higher than both > controllers and views. How can I do that? Or should I make it a > global > function somehow? > > If you don''t mind an additional question, please give me your > assessment of a rescue clause I added to show_session, as shown > below. > > Thanks for your outstanding advice. > > Regards, > Richard > > class ApplicationController < ActionController::Base > before_filter :setup_tables, :show_session > layout "base" > > logger.debug "===================================" > logger.debug "Entering app\\controllers\\application.rb (top level)" > logger.debug "===================================" > > def setup_tables > tables = [:customers, :invoices, :payments] > tables.each { |tbl| session[tbl] = {} } > session[:tables] = tables > end > > def show_session > logger.debug "Application tables:" > nTables = session[:tables].length > (0..(nTables-1)).each { |i| > symTbl = session[:tables][i] > objElement = session[symTbl] > logger.debug "\t" + symTbl.to_s + " => " + objElement.inspect > } > rescue > raise "session[:tables] => nil" unless session[:tables] > raise "nTables => #{nTables}" unless nTables != 3 > raise "symTbl => nil for session[:tables][#{i}]" unless symTbl > raise "objElement => nil for session[#{symTbl}]" unless objElement > end > > protected > def sort_clause(model, column, *order) > [snip] > end > > logger.debug "^^^^^^^^^^^^^^^^^^^^^^^" > logger.debug "Leaving app\\controllers\\application.rb (top level)" > logger.debug "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" > end >Lets rewrite some of this code to make it clearer. class ApplicationController < ActionController::Base before_filter :setup_tables, :show_session layout "base" def setup_tables tables = [:customers, :invoices, :payments].map{ |tbl| session [tbl] = {}; tbl } session[:tables] = tables end <snip> end SO I think you can leave out the show_session method. And when you want to see whats in the session in your view use this instead: <%= debug(session) %> That will show you everything that is currently in the session in a nice yaml formatted view. If you really want to be able to call the show_session method from a view then you can do that by useing helper_method like this: helper_method :show_session put that in your application.rb class right after the definition of show_session. Cheers- -- Ezra Zygmuntowicz -- Lead Rails Architect -- ez-NLltGlunAUd/unjJdyJNww@public.gmane.org -- Engine Yard, Serious Rails Hosting -- Reliability, Ease of Use, Scalability -- (866) 518-YARD (9273) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi Ezra, Thanks again for your excellent suggestions: <%= debug(session) %> and helper_method :show_session They''re nice to know. For the nonce, I want to stick with my show_session because it focuses on the specific details I want from session. (OK, call me "stubborn".) And the good news (for me, anyway) is that I solved the scope problem, thanks to Rails For Ruby: I moved the def to app\helpers\application_helper.rb (By the way, I deleted my previous message because I was going to substitute the essential part of this message. Then I discovered your reply. This electronic correspondence is great!) Again, many thanks for taking the time to look at (and solve!) my problem. Best wishes, Richard Ezra Zygmuntowicz wrote:> Hi~ > > On Oct 15, 2006, at 2:18 PM, Richard wrote: > > > > > Hi Ezra, > > > > Your advice was a great boost forward. But I still have a problem. > > > > BTW, I''m running: > > WinXP-Pro/SP2, MySQL 5.0.15-nt, Ruby 1.8.2-15, Rails 1.1.4 > > SciTE 1.59, FireFox 1.2.0.7, Java JDK 1.5.0_06 > > > > I used the before_filter :setup_tables, :show_session That allowed my > > show_session to method to work both upon entry and exit from the > > ApplicationController''s instantiation. > > > > Show session also worked in app\controllers\MainController.rb#welcome > > > > However, it failed in app\views\main\welcome.rhtml with the error: > > ActionView::TemplateError (undefined local variable or method > > `show_session'' > > > > So I think I need to move it''s def to someplace higher than both > > controllers and views. How can I do that? Or should I make it a > > global > > function somehow? > > > > If you don''t mind an additional question, please give me your > > assessment of a rescue clause I added to show_session, as shown > > below. > > > > Thanks for your outstanding advice. > > > > Regards, > > Richard > > > > class ApplicationController < ActionController::Base > > before_filter :setup_tables, :show_session > > layout "base" > > > > logger.debug "===================================" > > logger.debug "Entering app\\controllers\\application.rb (top level)" > > logger.debug "===================================" > > > > def setup_tables > > tables = [:customers, :invoices, :payments] > > tables.each { |tbl| session[tbl] = {} } > > session[:tables] = tables > > end > > > > def show_session > > logger.debug "Application tables:" > > nTables = session[:tables].length > > (0..(nTables-1)).each { |i| > > symTbl = session[:tables][i] > > objElement = session[symTbl] > > logger.debug "\t" + symTbl.to_s + " => " + objElement.inspect > > } > > rescue > > raise "session[:tables] => nil" unless session[:tables] > > raise "nTables => #{nTables}" unless nTables != 3 > > raise "symTbl => nil for session[:tables][#{i}]" unless symTbl > > raise "objElement => nil for session[#{symTbl}]" unless objElement > > end > > > > protected > > def sort_clause(model, column, *order) > > [snip] > > end > > > > logger.debug "^^^^^^^^^^^^^^^^^^^^^^^" > > logger.debug "Leaving app\\controllers\\application.rb (top level)" > > logger.debug "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" > > end > > > > > Lets rewrite some of this code to make it clearer. > > class ApplicationController < ActionController::Base > > before_filter :setup_tables, :show_session > layout "base" > > def setup_tables > tables = [:customers, :invoices, :payments].map{ |tbl| session > [tbl] = {}; tbl } > session[:tables] = tables > end > <snip> > end > > > SO I think you can leave out the show_session method. And when you > want to see whats in the session in your view use this instead: > > <%= debug(session) %> > > That will show you everything that is currently in the session in a > nice yaml formatted view. If you really want to be able to call the > show_session method from a view then you can do that by useing > helper_method like this: > > > helper_method :show_session > > put that in your application.rb class right after the definition of > show_session. > > > > Cheers- > > -- Ezra Zygmuntowicz > -- Lead Rails Architect > -- ez-NLltGlunAUd/unjJdyJNww@public.gmane.org > -- Engine Yard, Serious Rails Hosting > -- Reliability, Ease of Use, Scalability > -- (866) 518-YARD (9273)--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
This is just a test. Richard wrote:> Hi Ezra, > > Thanks again for your excellent suggestions: > <%= debug(session) %> and > helper_method :show_session > > They''re nice to know. For the nonce, I want to stick with my > show_session because it focuses on the specific details I want from > session. (OK, call me "stubborn".) > > And the good news (for me, anyway) is that I solved the scope problem, > thanks to Rails For Ruby: I moved the def to > app\helpers\application_helper.rb > > (By the way, I deleted my previous message because I was going to > substitute the essential part of this message. Then I discovered your > reply. This electronic correspondence is great!) > > Again, many thanks for taking the time to look at (and solve!) my > problem. > > Best wishes, > Richard > > Ezra Zygmuntowicz wrote: > > Hi~ > > > > On Oct 15, 2006, at 2:18 PM, Richard wrote: > > > > > > > > Hi Ezra, > > > > > > Your advice was a great boost forward. But I still have a problem. > > > > > > BTW, I''m running: > > > WinXP-Pro/SP2, MySQL 5.0.15-nt, Ruby 1.8.2-15, Rails 1.1.4 > > > SciTE 1.59, FireFox 1.2.0.7, Java JDK 1.5.0_06 > > > > > > I used the before_filter :setup_tables, :show_session That allowed my > > > show_session to method to work both upon entry and exit from the > > > ApplicationController''s instantiation. > > > > > > Show session also worked in app\controllers\MainController.rb#welcome > > > > > > However, it failed in app\views\main\welcome.rhtml with the error: > > > ActionView::TemplateError (undefined local variable or method > > > `show_session'' > > > > > > So I think I need to move it''s def to someplace higher than both > > > controllers and views. How can I do that? Or should I make it a > > > global > > > function somehow? > > > > > > If you don''t mind an additional question, please give me your > > > assessment of a rescue clause I added to show_session, as shown > > > below. > > > > > > Thanks for your outstanding advice. > > > > > > Regards, > > > Richard > > > > > > class ApplicationController < ActionController::Base > > > before_filter :setup_tables, :show_session > > > layout "base" > > > > > > logger.debug "===================================" > > > logger.debug "Entering app\\controllers\\application.rb (top level)" > > > logger.debug "===================================" > > > > > > def setup_tables > > > tables = [:customers, :invoices, :payments] > > > tables.each { |tbl| session[tbl] = {} } > > > session[:tables] = tables > > > end > > > > > > def show_session > > > logger.debug "Application tables:" > > > nTables = session[:tables].length > > > (0..(nTables-1)).each { |i| > > > symTbl = session[:tables][i] > > > objElement = session[symTbl] > > > logger.debug "\t" + symTbl.to_s + " => " + objElement.inspect > > > } > > > rescue > > > raise "session[:tables] => nil" unless session[:tables] > > > raise "nTables => #{nTables}" unless nTables != 3 > > > raise "symTbl => nil for session[:tables][#{i}]" unless symTbl > > > raise "objElement => nil for session[#{symTbl}]" unless objElement > > > end > > > > > > protected > > > def sort_clause(model, column, *order) > > > [snip] > > > end > > > > > > logger.debug "^^^^^^^^^^^^^^^^^^^^^^^" > > > logger.debug "Leaving app\\controllers\\application.rb (top level)" > > > logger.debug "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" > > > end > > > > > > > > > Lets rewrite some of this code to make it clearer. > > > > class ApplicationController < ActionController::Base > > > > before_filter :setup_tables, :show_session > > layout "base" > > > > def setup_tables > > tables = [:customers, :invoices, :payments].map{ |tbl| session > > [tbl] = {}; tbl } > > session[:tables] = tables > > end > > <snip> > > end > > > > > > SO I think you can leave out the show_session method. And when you > > want to see whats in the session in your view use this instead: > > > > <%= debug(session) %> > > > > That will show you everything that is currently in the session in a > > nice yaml formatted view. If you really want to be able to call the > > show_session method from a view then you can do that by useing > > helper_method like this: > > > > > > helper_method :show_session > > > > put that in your application.rb class right after the definition of > > show_session. > > > > > > > > Cheers- > > > > -- Ezra Zygmuntowicz > > -- Lead Rails Architect > > -- ez-NLltGlunAUd/unjJdyJNww@public.gmane.org > > -- Engine Yard, Serious Rails Hosting > > -- Reliability, Ease of Use, Scalability > > -- (866) 518-YARD (9273)--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---