在Rails cookie中存储/检索值



我创建了一个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?

我的网站不使用身份验证,我想显示最近由来宾创建的项目。因此,在Item控制器中,我有这样的内容:

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,我可以确认这是首字母值设置为[](OK)
  • 在用户创建一个项目后,我希望cookie数组有一个额外的值,但它被转换为Nil,什么都不存在(坏)。它甚至不会抛出异常。

哪里出错了?我应该如何向cookie添加新值?另外,检查cookie是否存在的首选方法是什么?似乎#has_key?方法不可用。

一些附带问题:

因为我想显示客人项目的链接(存储在cookie中),其形式为:

link_to @item.title, item_path(@item.id)

我应该在#create操作中创建链接并将它们存储在cookie中吗?还是只保留已知的id来生成它们?我担心cookie可能无法存储此类链接(因此我最初认为仅存储id)

Thanks in advance

编辑:似乎不可能使用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还是链接?

我最近遇到了一个类似的问题,并通过创建一个CookieCollection类来解决它,该类隐藏了所有cookie哈希交互,并允许您像使用Array一样从集合中添加和列出。它是通过一个控制器方法和助手来公开的。

http://www.swards.net/2013/08/cookie-collection-objects.html

如果Item模型是非平凡的,则不要将其加载到cookie中。cookie的限制大约是2k,数据的序列化很快就会消耗掉这个限制。在任何情况下,都应该对数据库(或其他东西)进行持久化,并且只有最少量的会话状态需要进入cookie。项目被创建到数据库中。如果你想在客户端加载项目,请使用javascript。

即使你有客人物品,也只需将其加载到数据库中并以某种方式标记。IE:放入一个来宾表,或者有一个列设置guest=1或有一个foreign_key到guest_items表或其他东西。实际上(即使使用匿名认证),会话只有当前用户ID(在您的情况下,没有)。我假设您正在尝试为"记住我"类型的功能持久化永久cookie,这很好。抽象层有点奇怪。在简单系统中首选的方式是:

# in controller, bad idea
cookies['items'] << Item.new("whatever")

保存在数据库中,会话只存储在cookie中

相关内容

  • 没有找到相关文章

最新更新