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 が配列ではないかのように、この行を指しています。

ここでクッキーに何か問題がありますか?

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 arrayto_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 に答える