0

私が構築しているアプリに賛成投票システムを実装しています。これは、stackoverflowでのシステムと非常によく似ています。ユーザーが賛成票または反対票をクリックすると、ajaxリクエストが私のコントローラーの1つに送信され、いくつかのテーブルが更新されます。それが完了したら、respond_toを使用して、jqueryを実行してユーザー表示を更新するjs.erbファイルにルーティングします。ただし、jqueryは実行されていません。賛成/反対をなめると、コントローラーコードは正しく実行されますが(レールコンソールで確認できます)、ユーザー表示は更新されません。更新すると、ユーザー表示は更新されますが、非同期ではありません。jqueryがファイアバグコンソールでb/cで実行されていないことはわかっていますが、jqueryコードを確認できます。適用されていないだけです。これが私の賛成コントローラーコードです:

def upvote
        @post = Post.find(params[:id])

        @user_vote = current_user.votes.where(post_id: @post.id).first
        if @user_vote.blank?
            Vote.create(user_id: current_user.id, post_id: @post.id, vote: 1)
            @post.upvotes += 1
        elsif @user_vote.vote.to_i == 0
            @user_vote.vote = 1
            @post.upvotes += 1
        elsif @user_vote.vote.to_i == 1
            return redirect_to :back, :alert => 'You have already upvoted the post'
        elsif @user_vote.vote.to_i == 2
            @user_vote.vote = 1
            @post.downvotes -= 1
            @post.upvotes += 1
        end

        respond_to do |format|
            if @post.save and @user_vote.save
                format.js { }
            else 
                format.html { redirect_to :back, :alert => 'There was an error in upvoting the post' }
            end
        end

    end 

これは私のupvote.js.erbファイルです:

$('#post-action-<%= @post.id %>').html("upvote");
// this normally renders a partial (below), but I am rendering "upvote" until I can fix this
// escape_javascript(<%= render :partial => 'post_voting', :locals => { post: @post, user_vote: @user_vote } %>) 

これが私のhtmlです:

         <div class="post_actions" id='post-action-<%= "#{post.id}" %>' >

            <%= render :partial => 'post_voting', :locals => { post: post, user_vote: current_user.votes.where( post_id: post.id ).first } %>

        </div>

これが私のfirebugコンソールの出力です:http://i.imgur.com/H6zXJ.png

編集

サーバーでエラーが発生していることに気づきました。

Started GET "/assets/bootstrap.js?body=1" for 127.0.0.1 at 2012-08-09 06:33:42 -0700
Served asset /bootstrap.js - 304 Not Modified (0ms)
4

2 に答える 2

0

jqueryをいじった後、私はいくつかのことに気づきました。まず、コードを縮小する必要がありました(すべてのコメントと未使用のスペースを削除します)。私はこれを取りました:

$('#post-action-<%= @post.id %>').html("upvote");
// this normally renders a partial (below), but I am rendering "upvote" until I can fix this
// escape_javascript(<%= render :partial => 'post_voting', :locals => { post: @post, user_vote: @user_vote } %>) 

そしてそれをこれに変更しました:

$('#post-action-<%= @post.id %>').html("upvote");

その後、コードは機能し、ユーザー表示は「賛成」を表示するように更新されていました。完全。そこで、上記のコードを次のように置き換えました。

$('#post-action-<%= "#{@post.id}" %>').html("<%= escape_javascript(render :partial => 'post_voting', :locals => { :post => @post, :user_vote => @user_vote }) %>");

とKAPOW!できます。これを解決できてとても幸せです!JQUERYの人々を縮小してください!

于 2012-08-09T15:00:18.867 に答える
0

コードは問題ないようで、実行する必要があります。計算されたIDの代わりに固定IDを更新するために、追加のチェックを行う場合があります。

$('#updateme').html("upvote");

このIDをHTMLのどこかに追加します。これが機能する場合は、ajax-callが完全に実行されていることを確認できます。問題は、参照しているIDだけです。

「post-action-2」というIDがあることをhtmlソースで確認しましたか?

于 2012-08-09T12:49:10.443 に答える