2015-02-05 17 views
1

我正在爲如何使用Rails構建「upvote」流而苦苦掙扎,使得upvote在最終用戶身上立即發生。所以,首先,要定義upvote,我的意思就像你在reddit上做的那樣,點擊向上箭頭註冊一個記錄投票,然後增加一個計數器(另一個例子是在YouTube上豎起大拇指)。立即做出決定(Rails + MySQL + jQuery)

我正在使用Rails 3.2,jQuery和MySQL的數據庫。

現在我的流程是這樣的:

  1. 在html.erb模板時,給予好評元素有一個.js-remote-upvote類,它結合了點擊使用jQuery:

    $('body').on('click', '.js-remote-upvote', function(e) { e.preventDefault(); e.stopPropagation(); $this = $(e.currentTarget); $.ajax({ type: $this.data('method') == "post" ? "POST" : "GET", url: $this.data('url') }) });

  2. data-url轉到我的UpvotesController切換操作,該操作會創建upvote記錄並處理其他一些misc。的東西。

  3. toggle.js.erb模板包含JavaScript代碼,該代碼在upvote元素上添加.active類,並遞增計數器。

問題是,無論我試圖在控制器中放置切換操作多少時間,它都會消耗一些時間(應用程序範圍內的before_filters,跟蹤等等)。這導致upvote不會對最終用戶產生瞬間感覺,當我們習慣於在reddit上立即發起upvotes時,我覺得這對於UX而言是一個糟糕的用戶體驗。

我在想這個方法嗎?或者我應該增加計數器並立即設置.active css類之前請求傳遞給Rails?這對我來說是錯誤的,因爲控制器可能會拋出一個異常 - 基本上感覺就像js是「啞巴」一樣,無論後端發生什麼事情,都會立即向用戶顯示即時提示。

這是一個不好的模式,採取? 謝謝!

+1

我建議你以顯示用戶立即投票。這不是那種需要很多安全性的信息。如果在下一頁出現問題,請重新加載此投票消失,所以你不會擔心有人高舉infitite時間 – Avdept 2015-02-06 10:49:06

回答

2

我做相同的,但使用trick..As軟件開發者,只有我們都知道發生了什麼的scenes.So後面不管你怎麼努力,你必須存儲upvote計數,誰點擊upvote,有計數incremted ...等細節,然後更新視圖。

而不是去到服務器並更新數據庫的細節,然後更新VIEW..YOU可以先UPDATE OF /更改視圖,然後移動到服務器使用AJAX配置了快速查找用戶。

所以先爲良好的用戶體驗 .. FIRST更新使用jQuery,然後使用Ajax從更新投票控制器調用方法......所以ATLEAST用戶視圖代碼, 其即時,你知道在幕後花費至少2秒...

在查看文件中...

####update the count and also show that user has voted successfully by jquery 
$('#image_up_<%= @image.id%>').html(function(i, val) { return val*1+1 }); 
$(".user_vote_status").html("You like this Image"); 

服務器端...更新細節,並再次更新視圖進行確認

def vote 

    @image = Image.find(params[:id]) 
    ###method to add count by current user 
    @image.vote_by_current_user(current_user.id,params[:type]) 
    ###code to update the count 
    ## reload to get latest count 
    @image.reload 

    respond_to :js 
end 

在vote.js.erb

$('#image_up_<%= @image.id%>').html("<%= @image.likes.size %>"); 
//update the vote status on the page that user has liked/disliked the post 
$(".user_vote_status").html("You like this Image");