立即进行投票(Rails + MySQL + jQuery)

时间:2015-02-05 19:39:04

标签: javascript jquery html ruby-on-rails ruby-on-rails-3

我正在努力构建一个" upvote"使用Rails& jQuery,就最终用户而言,upvote会立即发生。

首先,要定义upvote,我的意思就像你会在reddit上做的那样,点击向上箭头会记录对记录的投票,并增加一个计数器(在YouTube上竖起大拇指是另一个例子)。

我使用Rails 3.2,jQuery和MySQL作为数据库。

现在我的流程是:

  1. 在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') }) });

  2. data-url转到我的UpvotesController切换操作,创建upvote记录,并处理其他一些misc。的东西。

  3. 然后,toggle.js.erb模板包含在upvote元素上添加.active类的javascript代码,并递增计数器。
  4. 问题在于,无论我多少尝试在控制器中倾斜切换操作,它都会消耗一些时间(应用程序范围广泛的前导,跟踪,类似的东西)。这导致了最终用户不能立刻感受到这种情况,当我们习惯于在reddit上立即进行投票时,我认为这会导致糟糕的用户体验。

    我是否正确地思考这个问题?或者我应该增加计数器并在将请求传递给Rails之前立即设置.active css类?对我来说这感觉不对,因为控制器可以抛出异常 - 基本上感觉就像js是"哑巴"并且无论后端发生什么,都只会向用户显示即时支持。

    这会是一个糟糕的模式吗? 谢谢!

1 个答案:

答案 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");