在哪里设置会话默认值?

时间:2011-09-13 06:42:51

标签: ruby-on-rails-3 session

家伙! 在询问之前我应该​​提一下,我在没有ActiveRecord或任何自托管数据库的情况下工作。这就是为什么我必须在会话中存储一些值。

从一开始我就决定在布局中设置用户城市的会话值。 - 我想它会在其他任何东西之前加载。所以我做了类似的事情:

<% session[:city] ||= {:name => 'City-Name', :lat => '40', :lng => '40'}%>

但是当我直接加载到内页时会发生会话[:city is nil *(

我应该如何设置会话,以便它不会是nil ???

1 个答案:

答案 0 :(得分:1)

我在其中一个应用程序中有类似的需求。它需要在登录时加载用户数据并存储在会话中。因此,编写了一个名为session_helpers.rb的模块,其中包含以下内容:

module SessionHelpers
  def get_value(key)
    session[key.to_sym]
  end

  protected
    def store_data(*objects)
      objects.each do |object|
        if object.is_a?(Hash)
          object.each do |key, value|
            session[key.to_sym] = value
          end
        end
      end
    end

    def remove_data(*objects)
      objects.each do |object|
        if object.is_a?(String)
          key = to_id(object)
        else
          key = to_id(object.class.name)
        end
        session[key] = nil
      end
    end

    def update_data(key, value)
      session[key.to_sym] = value
    end

  private
    def to_id(name)
      "#{name.parameterize('_').foreign_key}".to_sym
    end
end

您也可以将任何或所有方法用于视图:

# application_controller.rb
helper_method :get_value

从模型中我将检索需要在关于用户的会话中放置的数据的哈希值:

def common_data
  @data = Hash.new

  @data.merge!( { 'news'         => self.news.count } )
  ...
  @data
end

我想在登录后执行此操作后,我会覆盖设计方法来执行此操作:

def after_sign_in_path_for(resource_or_scope)
  store_data( '_count', current_user.common_data )

  dashboard_path
end

通过这种方式,我可以在登录时加载有关用户的重要数据,并将其存储在会话中并随时检索。希望这会有所帮助。