2010-05-21 5 views
0

J'utilise avec succès RJS pour implémenter AJAX sur un fichier page.replace.html create.js.rjs. J'essaye de mettre à jour deux endroits au lieu d'un et après avoir regardé Ryan Bates Railscast je suis très proche (je pense) mais ai un problème dans la syntaxe de mon /views/likes/create.js.rjs fichier. Voici la situation:Mise à jour de plusieurs divs avec RJS/AJAX

situé à /views/likes/create.js.rjs est le code suivant:

page.replace_html "votes_#{ @site.id }", :partial => @like 
page.replace_html "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id}) 
page[@like].visual_effect :highlight 

Mon problème se situe dans la deuxième ligne. Le div « compteur » affiche le code suivant dans la page /views/question/show.html.erb:

<div id="counter"> 
     You have <%= 10 - (@question.likes.count :conditions => {:user_id => current_user.id}) %> votes remaining for this question 
    </div> 

De regarder le casting écran je crois que mon erreur a à faire w/la syntaxe du second ligne. Spécifiquement, il mentionne que vous ne pouvez pas utiliser une variable d'instance locale, mais ne savez pas comment faire la modification. Pensées?

MISE À JOUR: Voici l'erreur que je reçois:

ActionView::TemplateError (undefined method `likes' for nil:NilClass) on line #2 of app/views/likes/create.js.rjs: 
1: page.replace_html "votes_#{ @site.id }", :partial => @like 
2: page.replace_html "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id}) 
3: page[@like].visual_effect :highlight 

    app/views/likes/create.js.rjs:2:in `_run_rjs_app47views47likes47create46js46rjs' 
    app/views/likes/create.js.rjs:1:in `_run_rjs_app47views47likes47create46js46rjs' 
    app/controllers/likes_controller.rb:8:in `create' 

Rendered rescues/_trace (103.8ms) 
Rendered rescues/_request_and_response (0.4ms) 
Rendering rescues/layout (internal_server_error) 

MISE À JOUR:

classe LikesController < ApplicationController

def create 
    @user = current_user 
    @site = Site.find(params[:site_id]) 
    @like = @site.likes.create!(params[:like].merge(:user_id => @user.id)) 

    respond_to do |format| 
    format.html { redirect_to @site} 
    format.js 
    end 
    end 
end 

MISE À JOUR: voici les goûts forment:

<% remote_form_for [site, Like.new] do |f| %> 
    <%= f.hidden_field :site_name, :value => "#{site.name}" %> 
    <%= f.hidden_field :question_id, :value => @question.id %> 
    <%= f.hidden_field :ip_address, :value => "#{request.remote_ip}" %> 
    <%= f.hidden_field :like, :value => "1" %> 
    <%= submit_tag "^" , :class => 'voteup' %> 
<% end %> 
+0

Veuillez coller le code de votre action de contrôleur qui est exécutée sur cette requête ajax. – klew

+0

vient d'ajouter le contrôleur J'aime créer une action ... c'est ce dont vous parliez? – bgadoci

Répondre

2

Essayez d'obtenir @question comme ça, comme question_id sera présent à l'intérieur params [: comme] hachage

@question = Question.find params[:like][:question_id] 

Quoi qu'il en soit pour double contrôle imprimer vos params comme celui-ci il faut donc ajouter une déclaration de met à créer une action de likes_controller .

puts params.inspect,params[:like][:question_id] 

Vous avez cette erreur (méthode non définie aime pour nulle: NilClass) sur la ligne n ° 2

Ce qui signifie que votre @question est nul, vous jamais déclaré cette instance dans votre action de création.

Espérons que cela fonctionne pour vous.

+0

Gentil homme ... qui a fonctionné parfaitement – bgadoci

+0

heureux d'entendre cela :). – Vamsi

0

Vous obtenez @question = nil. Vous devriez vérifier @question est nul ou @ question.likes.count = 0 et si oui, vous devez faire (10-0), à savoir

if //your condition here 
    page.replace_html "counter", "You have 10 votes remaining for this question" 
else 
    page.replace_html "counter", 10 - (@question.likes.count :conditions => {:user_id => current_user.id}) 

OU

remaining_votes= (@question && [email protected] && @question.likes.count :conditions => {:user_id => current_user.id} !=0)? @question.likes.count :conditions => {:user_id => current_user.id} : 0 
page.replace_html "counter", "You have #{10-remaining_votes } votes remaining for this question" 
0

Dans le contrôleur vous devez charger @question variable.

+0

Ai-je juste besoin d'ajouter: '@question = Question.find (params [: question_id])'? ou dois-je aussi affecter le '@like = @ site.likes.create! (params [: like] .merge (: user_id => @ user.id))' dans un sens? – bgadoci

+0

Oui, ça devrait être quelque chose comme '@question = Question.find (params [: question_id])' mais cela dépend de votre hash 'params' actuel qui dépend de votre URL. Si votre URL ressemble à ceci: 'myhost.com/questions/45' alors 'question_id' est dans' params [: id] '. Votre code avec '@ like' devrait fonctionner, mais cela dépend aussi. Si votre formulaire est créé correctement, cela devrait suffire. – klew

+0

J'ai posté mon formulaire car je n'arrive pas à faire fonctionner votre solution. Voir la question éditée. – bgadoci

Questions connexes