2013-08-27 2 views
0

Я работаю под рельсами и, как новичок, я пытаюсь понять, как работает сессия. я кладу сессии под активной записью, но когда я делаю это:Заседание недоразумений в Ruby on Rails

@request = Facebook::Request.parse_signed_request(params[:signed_request], 
    Settings.facebook.app_secret) 
    puts session 
    @admin = Admin.find_by_fb_userid(@request["user_id"]) 
    session[@request["user_id"]] = @admin ? @admin : nil 

Моего сеанса продолжает показывать:

{} 

Спасибо за вашу помощь!

ответ

1

Попробуйте напечатать значение сеанса вместо всего объекта сеанса:

puts session[@request['user_id']] 

Делайте это до и после установки сеанса. И убедитесь, что вы очистили сеанс перед тестированием этого в браузере (очистить файлы cookie или начать сеанс инкогнито).

И последнее, но не менее важное: это плохая идея хранить целые объекты в сеансе. Таким образом, вы сохраняете больше данных на сеансе, чем необходимо. Попробуйте сохранить только идентификатор объекта (в вашем случае @admin.id), а затем загрузите его, когда это необходимо.

+0

Что значит печать значения сеанса? Это не то, что я делаю puts session – Nox

+1

Я хочу сказать, что используйте 'puts session ['something']' вместо просто 'puts session'. – jurglic

2

Как работает сессия?

HTTP является лицом без protocol.It означает, что он рассматривает каждый запрос в качестве независимой сделки , которая не связана с любым предыдущим запросом так, что сообщение состоит из независимых пар запросов и ответов.

без гражданства протокол не требует серверов сохранить сеанс информацию или статус каждого коммуникационного партнера на протяжении нескольких запросов.

Протокол не предоставляет никаких средств для хранения данных пользователя между запросами.

Поэтому мы используем Sessions, что позволяет нам цепи несколько запросов вместе в разговоре между клиентом и сервером, поэтому temporaly держать data.

Session является hash, так что вы можете добавить данные в сессию, как в обычный хэш:

Например, чтобы добавить новый заказ в сеанс может выглядеть следующим образом:

например OrdersController

def new 
@order = current_user.orders.create # creates a new order for current_user 
session[:order] = @order.to_params # adds order information to the session. 
end 

Сессии могут хранить любой вид string данных, но лучше всего, держа его как можно как для скорости и безопасности, поскольку сторонние пользователи могут легко расшифровать, какая информация хранится в сессий.

UPDATE

по умолчанию session data сохраняются как cookies но Rails позволяет конфигурировать session storage в базе данных с использованием ActiveRecordStore или InMemory хранения с Redis и Redis store. Каждый подход имеет свои преимущества и недостатки.

+0

Хорошо, я вижу, большое спасибо. В этом случае, какова цель хранения в cookie или базе данных, если это не сохранить его? Я имею в виду, что я недавно работал в Node.js под Express и каждый раз, когда сеанс открыт, он хранится в базе данных. Поэтому для пользователя у меня всегда есть его идентификатор пользователя, и я могу легко получить его сеанс. Здесь я действительно не знаю, как это сделать. Означает ли это, что в моем родительском контроллере у меня должен быть метод, который воссоздает сессию каждый раз как before_action? ps: Извините за мой английский – Nox

+0

См. Обновленный ответ. Создайте новый вопрос, PLS для этого раздела, поскольку это слишком широкая тема, которая будет рассмотрена здесь ... –

0

ОК, я виноват, что я работал над приложением facebook, которое я предполагаю, и для каждого обновления сеанс сбрасывается сверстником.

Но когда я продолжил свой процесс, все мгновенно работало.

И даже если сеанс является протоколом без состояния, он используется через хранилище, которое используется для поддержания сеанса в течение всего сеанса.

Как в PHP или на всех языках