JQuery + thumbs_up gem渲染投票数?

ahu*_*ng7 2 javascript jquery ruby-on-rails voting ruby-on-rails-3

插件: Thumbs Up和JQuery 1.5.2(另一个旧宝石需要)

当用户在帖子上投票时,我正在尝试使用完整的HTTP请求呈现更新的投票计数.目前,它会在每次投票时刷新页面.

帖子控制器

def vote_up
  post = Post.find(params[:id])
  current_user.vote_exclusively_for(post)
  respond_to do |format|
    format.js
    format.html {rRedirect_to :back}
  end
end

def vote_down
  post = Post.find(params[:id])
  current_user.vote_exclusively_against(post)
  respond_to do |format|
    format.js
    format.html {redirect_to :back}
  end
end
Run Code Online (Sandbox Code Playgroud)

投票视图(每个帖子div在左边有一个投票div(digg/reddit样式)和右边的内容)

 <div class="post">
 <div class="vote">
 <div class="votewrapper">
  <span class="votecount">
  <%= post.votes_for - post.votes_against %>
    </span>
  <div class="votebtn">
   <%= link_to image_tag('vote.png'), vote_up_post_path(post), :method => :post, :format => :js %>
     </div>
   </div>
   </div>
   <div class="postcontent">
   all the post content, timestamp stuff, etc...
   </div>
   </div>
Run Code Online (Sandbox Code Playgroud)

vote_up.erb.js(在帖子文件夹中).

$(".votecount").html(
"<%= escape_javascript post.votes_for - post.votes_against %>");
Run Code Online (Sandbox Code Playgroud)

我已经坚持了一段时间,非常感谢你能提供的任何帮助.我已经看过Jquery的railscast,并查看了其他Stackoverflow的答案,但我仍然在Jquery非常无聊.

小智 6

您似乎希望将视图代码分成部分,并且只在提供评级时刷新一个部分.

对于您的控制器,而不是:

respond_to do |format|
    format.js
    format.html {redirect_to :back}
  end
Run Code Online (Sandbox Code Playgroud)

做类似的事情:

render :partial => "voutecount"
Run Code Online (Sandbox Code Playgroud)

在您的视图中,将votewrapper div移出到同一目录中名为"_votecount.html.erb"的新文件中,而不是具有呈现代码:

 <%= render :partial => "votecount" %>
Run Code Online (Sandbox Code Playgroud)

如果你想在刷新时阻止评级(推荐),那么你可能想要调整呼叫并在js中更多地控制它.所以,在视图中包含你的javascript:

<%= javascript_include_tag 'votecount' %>
Run Code Online (Sandbox Code Playgroud)

用好的'html替换你的link_to以获得更多信息:

<a href="" class="ratelink" updown="up" theid="123"><img src = "...."></a>
<a href="" class="ratelink" updown="down" theid="123"><img src = "...."></a>
Run Code Online (Sandbox Code Playgroud)

并在您的public/javascripts文件夹中创建一个新的votecount.js,其中包含以下内容:

  $(function(){
        $(".ratelink").click(function(){
            var val = $(this).attr('updown');
            var theid = $(this).attr('theid');
            $("#votewrapper").block({ //blocks rate-rates while processing
                message: null,
                overlayCSS: {
                    backgroundColor: '#FFF',
                    opacity: 0.6,
                    cursor: 'default'
                },
            });
        if (val == "up") {
        $.ajax({
                type: 'PUT',
                url: "/mymodel/voteup?id="+theid,
                success: function(){
                            $("#votewrapper").unblock();
                            }   
                   });
        } else {
             $.ajax({
                type: 'PUT',
                url: "/mymodel/votedown?id="+theid,
                success: function(){
                            $("#votewrapper").unblock();
                            }   
                   });
        }
    })
Run Code Online (Sandbox Code Playgroud)

祝好运!:)