首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制用户只在ruby on rails中“喜欢”一篇文章一次?

如何限制用户只在ruby on rails中“喜欢”一篇文章一次?
EN

Stack Overflow用户
提问于 2012-06-09 12:26:17
回答 3查看 1.4K关注 0票数 1

基本上,我有一个页面,其中列出了10个最近的微博。每个帖子都有一个相似的按钮。单击此“相似”按钮时,将更新我的数据库中的“喜欢”表。

喜欢表:

代码语言:javascript
复制
+----+------------+--------------+-------------------------+-------------------------+---------+
| id | likable_id | likable_type | created_at              | updated_at              | user_id |
+----+------------+--------------+-------------------------+-------------------------+---------+
| 2  | 5770       | Micropost    | 2012-06-09 11:30:55 UTC | 2012-06-09 11:30:55 UTC | 2       |
| 3  | 5770       | Micropost    | 2012-06-09 11:42:45 UTC | 2012-06-09 11:42:45 UTC | 2       |
+----+------------+--------------+-------------------------+-------------------------+---------+

用户必须能够只喜欢微博一次。我可以使用一些jquery/js来实现这一点,方法是显示一个不一样的按钮,在喜欢微信的时候指向破坏路径。

但是,是否也有一种方法来实现服务器端呢?就像不允许一个微博被喜欢不止一次,以任何必要的方式?所以,如果我要进入rails控制台,尝试手动地喜欢一个我已经喜欢的微博,它就不能工作了,因为它会看到我已经喜欢这个微博了吗?

类模型:

代码语言:javascript
复制
class Like < ActiveRecord::Base
  belongs_to :likable, :polymorphic => true
  attr_accessible :likable_id, :likable_type, :user_id
end

微信模型:

代码语言:javascript
复制
class Micropost < ActiveRecord::Base
    belongs_to :user
    has_many :likes, :as => :likable
end

喜欢控制器:

代码语言:javascript
复制
class LikesController < ApplicationController
  def create
    micropost = Micropost.find(params[:micropost])
     like = micropost.likes.build(:user_id => current_user.id)
     like.save
  end
end

喜欢表单:

代码语言:javascript
复制
<%= form_tag likes_path, :remote => true, :class => "like_micropost" do %>  
   <%= hidden_field_tag :micropost, micropost.id %>
       <%= submit_tag '', :class => "likeMicropostSubmit"  %> 
<% end %>

I之前尝试过这一点,但没有成功:

代码语言:javascript
复制
class LikesController < ApplicationController
  def create
    micropost = Micropost.find(params[:micropost])
    if micropost.likes.where(:user_id => current_user.id).nil?
     like = micropost.likes.build(:user_id => current_user.id)
     like.save
    end
  end
end

亲切的问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-09 12:38:28

代码语言:javascript
复制
# in Like class
validates_uniqueness_of :user_id, :scope => [:likable_id, :likable_type]

这样,您将得到验证错误时,试图喜欢的东西不止一次。

See docs for it.

票数 5
EN

Stack Overflow用户

发布于 2012-06-09 12:44:28

我会做两件事:

controller)

  • Add

  • 将创建逻辑移到模型(fat模型,skinny

  • ,在类似的创建中进行验证(如jdoe已经说过)

所以:

代码语言:javascript
复制
class LikesController < ApplicationController
  def create
    micropost = Micropost.find(params[:micropost])
    current_user.likes! micropost
  end
end

class Like < ActiveRecord::Base
  validates_uniqueness_of :user_id, :scope => [:likable_id, :likable_type]
end

class User < ActiveRecord::Base
  # exclamation mark to avoid confusion between things that are liked by the user
  def likes!(likable_object)
    unless likable_object.likes.where(:user_id => self.id).exists?
      like = likable_object.likes.build(:user_id => self.id)
      like.save
    end
  end
end

编辑:说明:

1)管理类似的创建阶段是一个模型任务,->将管理创建的代码移动到模型

2)找到一个很好的方法名来描述-> User.likes! something听起来不错的动作

3)实现了创建方法->。

代码语言:javascript
复制
def likes!(likable_object)
  like = likable_object.likes.build(:user_id => self.id)
  like.save
end

4)添加验证,以管理模型有效/模型无效逻辑-> class Like; validates_uniqueness_of ...

5)使likes!方法意识到有效/无效逻辑->

代码语言:javascript
复制
def likes!(likable_object)
  unless likable_object.likes.where(:user_id => self.id).exists?
    like = likable_object.likes.build(:user_id => self.id)
    like.save
  end
end
票数 0
EN

Stack Overflow用户

发布于 2012-06-09 12:36:49

好吧,这对我有用:

代码语言:javascript
复制
class LikesController < ApplicationController
  def create
    micropost = Micropost.find(params[:micropost])
    unless micropost.likes.where(:user_id => current_user.id).exists?
     like = micropost.likes.build(:user_id => current_user.id)
     like.save
    end
  end
end

没有创建模板是阻止它正常工作的原因,但是模板是空的,没有使用,所以不知道为什么它是强制性的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10960988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档