我正在努力构建一个" upvote"使用Rails& jQuery,就最终用户而言,upvote会立即发生。
首先,要定义upvote,我的意思就像你会在reddit上做的那样,点击向上箭头会记录对记录的投票,并增加一个计数器(在YouTube上竖起大拇指是另一个例子)。
我使用Rails 3.2,jQuery和MySQL作为数据库。
现在我的流程是:
在html.erb模板中,upvote元素有一个.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')
})
});
data-url
转到我的UpvotesController切换操作,创建upvote记录,并处理其他一些misc。的东西。
.active
类的javascript代码,并递增计数器。 问题在于,无论我多少尝试在控制器中倾斜切换操作,它都会消耗一些时间(应用程序范围广泛的前导,跟踪,类似的东西)。这导致了最终用户不能立刻感受到这种情况,当我们习惯于在reddit上立即进行投票时,我认为这会导致糟糕的用户体验。
我是否正确地思考这个问题?或者我应该增加计数器并在将请求传递给Rails之前立即设置.active
css类?对我来说这感觉不对,因为控制器可以抛出异常 - 基本上感觉就像js是"哑巴"并且无论后端发生什么,都只会向用户显示即时支持。
这会是一个糟糕的模式吗? 谢谢!
答案 0 :(得分:2)
我做了同样的但是使用了一个技巧..作为软件开发人员,只有我们知道幕后发生了什么。所以无论你怎么努力,你都要存储upvote
点数,点击谁upvote
,已计算incremted
...等详细信息,然后也会更新视图。
进入服务器并更新数据库中的详细信息,然后更新视图..您可以首先更新/更改视图,然后使用AJAX快速移动到服务器,这对用户来说很快。 强>
首先良好的用户体验 .. FIRST 使用jquery更新视图代码,然后使用ajax从更新投票的控制器调用方法< /strong>...So至少为用户,它的瞬间,你知道在幕后,至少需要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
in 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");