【发布时间】:2013-08-03 03:51:40
【问题描述】:
我创建了一个 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
问题如下:
- 之前的过滤器创建一个空 cookie,我可以确认它是初始的 值设置为 [](确定)
- 在用户创建项目后,我希望 cookie 数组有一个附加值,但它却变成了 Nil,并且什么都不存在 (BAD)。它甚至不会抛出异常。
我在哪里出错了?我应该如何向 cookie 添加新值? 此外,检查 cookie 是否存在的首选方法是什么?似乎#has_key?方法不可用。
一些附带问题:
因为我想显示客人物品的链接(存储在 cookie 中),其形式为:
link_to @item.title, item_path(@item.id)
然后我应该在#create 操作中创建链接并将它们存储在cookie 中吗?或者我应该只保留我所知道的 ID 来生成它们?我担心 cookie 可能无法存储此类链接(因此我最初想只存储 ID)
提前致谢
编辑:似乎无法将 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 中存储内容的首选方式是什么。纯 ID 还是链接?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 cookies