RubyChina如何實現喜歡功能?

2021-06-09 00:08:37 字數 3849 閱讀 2930

如:

實現的**解析如下:

在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.不要忘記微笑 保持微笑。世上人人都在尋求快樂,但只有一種確實有效的方法,那就是控制你的思...

如何與不喜歡的人打交道

很多人在生活中只願與自己喜歡的人交往,而對於不喜歡的人,或嗤之以鼻,或敬而遠之,總之不會主動去向人家示好,若是不喜歡的人同時又是有很大矛盾的人,就更會形同陌路,甚至橫眉冷對。而這種做法對工作和事業的發展卻非常不利。那麼,如何與不喜歡的人打交道呢?首先你要明白,是什麼原因使你對某個人特別反感,為什麼他...

如何追求自己喜歡的女孩子?

我是女生,看到有的男生想追自己喜歡的女孩子又不敢追,還想人家倒追她,我很反感.從乙個女生的角度,我比較了解女孩子的心理。女孩子大多不會主動出擊,去追求自己喜歡的男孩,除了確實太喜歡了或者是那種比較有個性的勇敢的女孩子。所以,如果你很喜歡乙個女孩子,並且認為她對你也有點意思,那就主動點,別跟她搞拉鋸戰...