2010-03-05 4 views
1

relier question: Vote_fu and Ajax requestsAjax et vote_fu | manquant avant déclaration

Il semble y avoir quelque chose de mal avec ma demande Ajax. Ce que j'essaie de faire est sur l'événement cliquez sur vote soumettre un vote, puis mettre à jour la page sans actualiser la page.

votes_controller.rb:

def create 
    @album = Album.find(params[:album_id]) 

    respond_to do |format| 
     if current_user.vote(@album, params[:vote]) 
     format.js { render :action => "create", :vote => @vote } 
     format.html { redirect_to([@album.user, @album]) } 
     #format.xml { render :xml => @album, :status => :created, :location => @album } 
     else 
     format.js { render :action => "error" } 
     format.html { render :action => "new" } 
     format.xml { render :xml => @vote.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
lien

| pour une vue album show:

<%= link_to_remote "Vote Up", 
:url => user_album_votes_path(album.user, album, 
:vote => :true, :format => :js), 
:method => :post %> 

application.js

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
}) 

jQuery(document).ready(function() { 
    $("#votes_.album").bind('click'); 
}) 

create.js

page.replace_html "#votes_{@album.id}", 
:partial => "album_vote", 
:locals => {:album => @album} 

Voici le message d'erreur suivant que je reçois:

missing ; before statement 
[Break on this error] page.replace_html "#votes_#{@album.id}", ...bum_vote", :locals => {:album => @album} 

Je ne suis pas sûr de ce que c'est g mal ici, j'ai suivi de nombreux exemples à partir de ladocdes problèmes de vote_fu.

http://github.com/peteonrails/vote_fu/tree#readme

une modification faite sur create.js

il y a maintenant une autre erreur:

Pas l'erreur est déplacé vers le votes_controller

NoMethodError (You have a nil object when you didn't expect it! 
<br /> 
The error occurred while evaluating nil.vote): 
    app/controllers/votes_controller.rb:53:in `create' 
    app/controllers/votes_controller.rb:52:in `create' 
<br /> 
Rendered rescues/_trace (128.4ms) 
Rendered rescues/_request_and_response (0.4ms) 
Rendering rescues/layout (internal_server_error) 

Ces lignes sont sur l'action créer, qui a l'air parfaitement bien !?

Comment puis-je faire fonctionner ceci?

Regard

Dan

Répondre

1

Essayez de changer les create.js à

page.replace_html "#votes_#{@album.id}", :partial => "album_vote", :locals => {:album => @album} 

vous auriez pu manquer le # pour l'interpolation de chaîne variable.

+0

essayé ceci ne fonctionne toujours pas! Merci SamChandra – MrThomas

0

Il me semble que current_user dans la méthode create n'a pas sa valeur définie.

Comment définir la valeur current_user? Dans d'autres plugins, ils définissent généralement ceci comme une méthode d'instance ou une variable d'instance avec un accesseur.

Alors peut-être changer la méthode create à ce qui suit pourrait aider:

def create 
    @album = Album.find(params[:album_id]) 

    respond_to do |format| 
     if @current_user.vote(@album, params[:vote]) 
     format.js { render :action => "create", :vote => @vote } 
     format.html { redirect_to([@album.user, @album]) } 
     #format.xml { render :xml => @album, :status => :created, :location => @album } 
     else 
     format.js { render :action => "error" } 
     format.html { render :action => "new" } 
     format.xml { render :xml => @vote.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Vous auriez pu manquer le @ avant le current_user.vote

+0

current_user est une méthode d'assistance en ajoutant @ est ne fonctionne pas. – MrThomas

1

Résolu!

Le problème était que je n'ai pas ajouté d'instruction before pour actualiser le nombre de votes! donc je l'ai fait et cela a fonctionné aussi bien que cela, je change le create.js à create.sj.erb, aussi j'ai apporté quelques petites modifications à mon fichier application.js. Après tout ce que j'ai ensuite ajouté un flash[:note] = you have voted!, puis ajouté une fonction pour supprimer la notification flash après une seconde et fadeOut!

Pour toute personne intéressée Heres le code:

Application.js

jQuery(document).ready(function() { 
    $("#vote").bind('click', function(e) { 
    if (e.target.tagName == "DIV") { 
     $(this).find(".album_extened").toggle('blind'); 
    } 
}) 

}) 

create.js.erb

$("#vote").before('<div id="notice"><%= escape_javascript(flash.delete(:notice)) %></div>'); 
$("#vote_count").html("<%= @album.votes_for - @album.votes_against %>"); 

$(document).ready(function() { 
    setTimeout(hideFlashMessages, 1000); 
}); 

function hideFlashMessages() { 
$("#vote, #notice").append('').fadeOut(1000); 
} 

Si quelqu'un sait mieux pourquoi que cela peut se faire s'il vous plaît vers l'avant!!

Une bonne vision de [http://railscasts.com/episodes/136-jquery][1]

lecture du [texte du lien] [2]

choses Bientôt fixe Merci Jonathan link text

[1]: http://railscasts.com/episodes/136-jquery/ "Rails Cast EP 136" [ 2]: http://www.notgeeklycorrect.com/english/2009/05/18/beginners-guide-to-jquery-ruby-on-rails/ "guilde des débutants à jQuery et Rails" et merci Sam pour être utile !!

Questions connexes