【问题标题】:Storing/Retrieving values in a Rails cookie在 Rails cookie 中存储/检索值
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 超级棒。这很棒。
    【解决方案2】:

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

    即使您有客人物品,只需将其加载到数据库中并以某种方式标记它。 IE:放入来宾表中,或者有一个列设置来宾 = 1 或者有一个外键到来宾表或其他东西。真的(即使使用匿名身份验证),会话只有当前用户 ID(在您的情况下,什么都没有)。我假设您正在尝试为“记住我”类型的功能保留永久 cookie,这很好。抽象层有点奇怪。简单系统中的首选方式是:

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

    持久化在数据库中,仅将会话存储在 cookie 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多