0

我正在创建一个博客,访问者可以“喜欢”每篇文章。我想限制他们只喜欢一次。我研究了不同的选项,我认为创建 cookie 是针对这种特殊情况的最佳选项。不过,我愿意接受其他建议。

这是饼干:

cookies[:liked] = { value: true, expires: 1.year.from_now }

我已将 cookie 放在我的 likes_controller.rb 中,如下所示:

class LikesController < ApplicationController
  def create
    @like = Like.new(params[:like])
    if @like.save
      cookies[:liked] = { value: true, expires: 1.year.from_now }
      redirect_to :back, notice: 'Glad you liked the post!'
    else
      redirect_to :back, notice: "Something went wrong liking the post."
    end
  end
end

在我的 _post.html.erb 部分中,我有我的帖子标题,喜欢,这里的帖子内容是“喜欢”部分:

<% if cookies[:liked] == true %>
  <div class="pull-right heart liked">♥&lt;/div>
<% else %>
  <div class="pull-right heart">
    <%= form_for (Like.new) do |f| %>
      <%= f.hidden_field :post_id, value: post.id %>
      <%= f.submit '♥', class: "hearts" %>
    <% end %>
  </div>
<% end %>

我没有收到任何错误,但它似乎也没有设置 cookie 或做任何事情。您有什么建议或见解吗?

4

1 回答 1

1

我认为你的解决方案很好。您还可以使用数据库会话存储而不是基于 cookie。但这在 Rails 4 中已被弃用。您可以在以下帖子中阅读更多相关信息:http: //blog.remarkablelabs.com/2012/12/activerecord-sessionstore-gem-extraction-rails-4-countdown-to-2013

所以我认为你的解决方案很好。

更新1:

如果您喜欢新帖子,我认为您总是会覆盖 cookie。我认为你可以解决你的问题,如下所示:

 class LikesController < ApplicationController

   def create
     @like = Like.new(params[:like])
     if @like.save
       cookies["liked_#{params[:like][:post_id]}".to_sym] = { value: true, expires: 1.year.from_now }
       redirect_to :back, notice: 'Glad you liked the post!'
     else
      redirect_to :back, notice: "Something went wrong liking the post."
    end
  end
end

而且您还必须更新您的视图。

更新2:

我在我的一个项目中使用调试器在控制台上进行了尝试(我采用了一个名为 Job 的模型而不是您的 Post 模型来模拟这种情况):

cookies["liked_#{Job.last.id}".to_sym] = { :value => true, :expires => 1.day.from_now }

将值设置为 true:

cookies["liked_#{Job.last.id}".to_sym] => true

在视图中:

<% if cookies["liked_#{Job.last.id}".to_sym] %>
  <p>cookie set</p>
<% else %>
  <p>cookie not set</p>
<% end %>

这给了我:“cookie set”,

但:

如果我重新加载页面,则会出现“cookie not set”。

如果我第二次调试:

cookies["liked_#{Job.last.id}".to_sym] => "true"

布尔值 true 更改为字符串“true”。我认为这是你的错误。

我会简单地将布尔值更改为字符串,同时设置 cookie:

cookies["liked_#{Job.last.id}".to_sym] = { :value => "true", :expires => 1.day.from_now }

在你的情况下:

cookies["liked_#{params[:like][:post_id]}".to_sym] = { value: "true", expires: 1.year.from_now }

在视图中:

<% if cookies["liked_#{Job.last.id}".to_sym] == "true" %>
  <p>cookie set</p>
<% else %>
  <p>cookie not set</p>
<% end %>

顺便说一句,如果您将来遇到此类问题,我建议您使用调试器 gem :)。

于 2013-09-13T20:56:16.860 回答