如:
實現的**解析如下:
在topics/show.html.erb頁面中, 有如下**
<%= likeable_tag(@topic) %>
具體**如下
def likeable_tag(likeable)
return "" if likeable.blank?
label = "#人喜歡"
if likeable.likes_count == 0
label = "喜歡"
end
if current_user && likeable.liked_by_user?(current_user)
title = "取消喜歡"
state = "liked"
icon = content_tag("i", "", :class => "icon small_liked")
else
title = "喜歡"
state = ""
icon = content_tag("i", "", :class => "icon small_like")
end
like_label = raw "# #"
link_to(like_label,"#",:title => title, :rel => "twipsy", 'data-count' => likeable.likes_count,
'data-state' => state,'data-type' => likeable.class,'data-id' => likeable.id,
end
此處在於構造乙個link_to tag,並且bind了乙個click方法
中具體實現如下
likeable : (el) ->
$el = $(el)
likeable_type = $el.data("type")
likeable_id = $el.data("id")
likes_count = parseint($el.data("count"))
if $el.data("state") != "liked"
$.ajax
url : "/likes"
type : "post"
data :
type : likeable_type
id : likeable_id
likes_count += 1
$el.data("state","liked").data('count', likes_count).attr("title", "取消喜歡")
$('span',el).text("#人喜歡")
$("i.icon",el).attr("class","icon small_liked")
else
$.ajax
url : "/likes/#"
type : "delete"
data :
type : likeable_type
if likes_count > 0
likes_count -= 1
$el.data("state","").data('count', likes_count).attr("title", "喜歡")
if likes_count == 0
$('span',el).text("喜歡")
else
$('span',el).text("#人喜歡")
$("i.icon",el).attr("class","icon small_like")
false
看看伺服器端的action吧。
# coding: utf-8
before_filter :require_user
before_filter :find_likeable
def create
current_user.like(@item)
render :text => @item.reload.likes_count
enddef destroy
current_user.unlike(@item)
render :text => @item.reload.likes_count
endprivate
def find_likeable
@success = false
@element_id = "likeable_#_#"
if not params[:type].in?(['topic','reply'])
render :text => "-1"
return false
endklass = params[:type].constantize
@item = klass.find_by_id(params[:id])
if @item.blank?
render :text => "-2"
return false
endend
end
定義了兩個action: create 和 destroy , 分別對應 喜歡 和 取消喜歡 , 對來自與客戶端的 type 引數,做了過濾
if not params[:type].in?(['topic','reply'])
並將字串 轉換成 類
klass = params[:type].constantize
在models/topic.rb中,include的乙個module
include mongoid::likeable
likeable的定義
# coding: utf-8
module mongoid
module likeable
extend activesupport::concern
included do
field :liked_user_ids, :type => array, :default =>
field :likes_count, :type => integer, :default => 0
end
def liked_by_user?(user)
return false if user.blank?
self.liked_user_ids.include?(user.id)
end
end
end
定義了 兩個字段
liked_user_ids 和 likes_count
並定義了乙個方法
liked_by_user?
controller中使用了 user.like 方法
# 收藏東西
def like(likeable)
return false if likeable.blank?
return false if likeable.liked_by_user?(self)
likeable.push(:liked_user_ids, self.id)
likeable.inc(:likes_count, 1)
end
like方法就是想陣列中push 資料
以上功能的實現,使用了 ruby的 module 引入和 duck type, 有很多值得學習的地方。
3 如何使人喜歡你
1.學會真誠地關心他人 真誠地關係別人。你我都知道,有些人常常終其一生想別人搔首弄姿,其他引起別人的注意。這大多數時候是枉費力氣。只有你真正的關心他人,才能贏得他人的注意 幫忙和合作。甚至最忙碌的人也不例外。2.不要忘記微笑 保持微笑。世上人人都在尋求快樂,但只有一種確實有效的方法,那就是控制你的思...
如何與不喜歡的人打交道
很多人在生活中只願與自己喜歡的人交往,而對於不喜歡的人,或嗤之以鼻,或敬而遠之,總之不會主動去向人家示好,若是不喜歡的人同時又是有很大矛盾的人,就更會形同陌路,甚至橫眉冷對。而這種做法對工作和事業的發展卻非常不利。那麼,如何與不喜歡的人打交道呢?首先你要明白,是什麼原因使你對某個人特別反感,為什麼他...
如何追求自己喜歡的女孩子?
我是女生,看到有的男生想追自己喜歡的女孩子又不敢追,還想人家倒追她,我很反感.從乙個女生的角度,我比較了解女孩子的心理。女孩子大多不會主動出擊,去追求自己喜歡的男孩,除了確實太喜歡了或者是那種比較有個性的勇敢的女孩子。所以,如果你很喜歡乙個女孩子,並且認為她對你也有點意思,那就主動點,別跟她搞拉鋸戰...