Я создал модуль SessionHelper, который выглядит примерно так:
module SessionHelper
def create_cookie
cookies.signed[:token] = {
:value => [],
:expires => 1.hour.from_now
}
end
def cookie_values
cookies.signed[:token]
end
def add_value_to_cookie(value)
cookies[:token] << value
end
def cookie_exists?
cookies[:token].present?
end
end
Затем он включается в контроллер приложений и запускается в фильтре перед каждым запросом:
create_cookie unless cookie_exists?
Мой сайт не использует аутентификацию, я хотел бы отобразить последние элементы, созданные гостем.
Итак, в контроллере предметов у меня есть что-то вроде этого:
def create
@item=Item.new(params[:item])
if @item.save
add_value_to_cookie(@item.id)
redirect_to @item
else
render :new
end
end
Проблема заключается в следующем:
- Фильтр before создает пустой
cookie, я могу подтвердить, что он начальный
значение установлено на [] (ОК)
- После того, как пользователь создаст элемент, я ожидаю, что массив cookie будет иметь дополнительное значение, но вместо этого он превращается в ноль, и ничего не происходит (ПЛОХО). Это даже не исключение.
Где я сделал ошибку? Как мне добавить новые значения в куки?
Кроме того, каков предпочтительный способ проверить наличие файла cookie? Кажется, что #has_key? метод недоступен.
Некоторые дополнительные вопросы:
Поскольку я хочу отображать ссылки на элементы гостя (хранящиеся в файле cookie), которые будут иметь вид:
link_to @item.title, item_path(@item.id)
Должен ли я просто создать ссылки в действии #create и сохранить их в файле cookie? Или я должен оставить только идентификаторы, которые я знаю, чтобы генерировать их? Я обеспокоен тем, что cookie не может хранить такие ссылки (поэтому я изначально думал о хранении только идентификаторов)
Заранее спасибо
РЕДАКТИРОВАТЬ: Кажется, что невозможно использовать cookie в качестве массива, и обходной путь должен использовать некоторую форму сериализации. Я остановился на JSON
module SessionHelper
def set_user_cookie
cookies.signed[:token] = {
:value => [].to_json,
:expires => 1.hour.from_now
}
end
def user_cookie_values
load_user_cookie_data
end
def user_cookie_exists?
cookies[:token].present?
end
def add_to_user_cookie(value)
current = load_user_cookie_data
current << value
cookies.signed[:token] = current.to_json
end
def remove_from_user_cookie(value)
current = load_user_cookie_data
current.delete(value)
cookies.signed[:token] = current.to_json
end
private
def load_user_cookie_data
JSON.load(cookies.signed[:token])
end
end
Хотя мне все равно было бы интересно услышать, каков предпочтительный способ хранения содержимого в cookie. Чистые идентификаторы или ссылки?