基本上,我有一个页面,其中列出了10个最近的微博。每个帖子都有一个相似的按钮。单击此“相似”按钮时,将更新我的数据库中的“喜欢”表。
喜欢表:
+----+------------+--------------+-------------------------+-------------------------+---------+
| 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控制台,尝试手动地喜欢一个我已经喜欢的微博,它就不能工作了,因为它会看到我已经喜欢这个微博了吗?
类模型:
class Like < ActiveRecord::Base
belongs_to :likable, :polymorphic => true
attr_accessible :likable_id, :likable_type, :user_id
end微信模型:
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :likes, :as => :likable
end喜欢控制器:
class LikesController < ApplicationController
def create
micropost = Micropost.find(params[:micropost])
like = micropost.likes.build(:user_id => current_user.id)
like.save
end
end喜欢表单:
<%= form_tag likes_path, :remote => true, :class => "like_micropost" do %>
<%= hidden_field_tag :micropost, micropost.id %>
<%= submit_tag '', :class => "likeMicropostSubmit" %>
<% end %>I之前尝试过这一点,但没有成功:
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亲切的问候
发布于 2012-06-09 12:38:28
# in Like class
validates_uniqueness_of :user_id, :scope => [:likable_id, :likable_type]这样,您将得到验证错误时,试图喜欢的东西不止一次。
See docs for it.
发布于 2012-06-09 12:44:28
我会做两件事:
controller)
所以:
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)实现了创建方法->。
def likes!(likable_object)
like = likable_object.likes.build(:user_id => self.id)
like.save
end4)添加验证,以管理模型有效/模型无效逻辑-> class Like; validates_uniqueness_of ...
5)使likes!方法意识到有效/无效逻辑->
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发布于 2012-06-09 12:36:49
好吧,这对我有用:
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没有创建模板是阻止它正常工作的原因,但是模板是空的,没有使用,所以不知道为什么它是强制性的。
https://stackoverflow.com/questions/10960988
复制相似问题