1

我有一个 Rails 3 博客。我希望每个帖子都有一个“喜欢”按钮。单击它将将此操作保存到数据库并存储到刚刚喜欢该帖子的用户的 cookie 中(再次禁止相同的操作)。

我写了一个简单的动作来做到这一点:

def like
  render :nothing => true

  id = params[:post_id]
  cookies.permanent[:like_history] ||= []

  unless cookies.permanent[:like_history].include? id
    cookies.permanent[:like_history] << id

    @post = Post.find(id)
    @post.update_column(:likes, @post.likes + 1)
  end
end

但是NoMethodError (undefined method '[]' for nil:NilClass)当我尝试记录事情时,我得到了。它指向这一行:cookies.permanent[:like_history] ||= []好像 cookies.permanent 不是一个数组。

我在这里用 cookie 做错了吗?

4

2 回答 2

4

事实证明, ||= 运算符被视为 Rails 标准的“阅读”,这实际上是有道理的。你不能用 来“阅读” cookies.permanent[:symbol],那是为了写作,你用 来阅读cookies[:symbol]。所以我修改了那行:

cookies.permanent[:like_history] = "" unless defined? cookies[:like_history]

于 2013-03-25T00:41:08.223 回答
0

我认为您存储的东西cookies.permanent[:like_history]不是Array. 因此,制作nilcovert to array使用to_a并尝试您的代码。

def like
  render :nothing => true
  cookies.permanent[:like_history] = nil #or cookies.permanent[:like_history] = cookies.permanent[:like_history].to_a 

  id = params[:post_id]
  cookies.permanent[:like_history] ||= []

  unless cookies.permanent[:like_history].include? id
    cookies.permanent[:like_history] << id

    @post = Post.find(id)
    @post.update_column(:likes, @post.likes + 1)
  end
end

一旦它起作用,删除您添加的那条线。

于 2013-03-24T06:40:01.417 回答