Где установить значение сеанса по умолчанию? - PullRequest
0 голосов
/ 13 сентября 2011

ребята! Прежде чем спросить, я должен упомянуть, что я работаю без ActiveRecord или любой собственной базы данных. Вот почему я должен хранить некоторые значения в сессии.

С самого начала я решил установить значение сеанса города пользователей в макете. - Я предполагал, что он будет загружен раньше всего. Итак, я сделал что-то вроде этого:

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

Но когда я загружаюсь прямо на внутреннюю страницу, происходит сессия [: city is nil * (

)

Как правильно установить сессию, чтобы она не была равна нулю ???

1 Ответ

1 голос
/ 13 сентября 2011

У меня были похожие потребности в одном из приложений, над которым я работал. Необходимо, чтобы данные пользователей были загружены при входе в систему и сохранены в сеансе. Итак, написал модуль под названием 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

Поскольку я хотел сделать это после входа в систему, я переопределил метод devise, чтобы сделать это:

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

  dashboard_path
end

Таким образом, я смог загрузить важные данные о пользователе при входе в систему, сохранить их в сеансе и извлекать их в любое время. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...