2010-08-09 2 views
1

J'implémente une fonctionnalité "favoris" dans une application de blog communautaire, et j'aimerais utiliser Ajax.Résoudre les problèmes de création d'un nouvel enregistrement dans Rails en utilisant Ajax

Lorsque les utilisateurs aiment un post en première page, ils peuvent cliquer sur un symbole "+" pour ajouter ce post à leur collection de favoris.

La fonctionnalité fonctionne très bien sans fonctionnalité Ajax. Mais maintenant j'ajoute l'Ajax.

De l'avis:

<span id="favorite_<%= entry.id %>"> 
    <%= link_to_remote "+", :url => { :action => 'add_favorite' }, 
          :entry => entry.id, 
          :user => session[:user_id], 
          :update => 'favorite_' + entry.id.to_s %> 
</span> 

L'action du contrôleur correspondant:

def add_favorite 
    @favorite = Favorite.new(:entry_id => :entry, :user_id => :user) 
    if @favorite.save 
    render :text => "added to favorites", :layout => false 
    end 
end 

Le texte est rendu de manière appropriée dans la vue, comme si l'action a travaillé. Mais quand je regarde la liste des favoris, elle n'a pas été ajoutée.

j'ai couru la ligne

@favorite = Favorite.new(:entry_id => :entry, :user_id => :user) 

dans le shell interactif et il était bon. Tout a sauvé.

Qu'est-ce que je néglige/fais mal?

Répondre

0

Pour une raison quelconque vous passez des symboles au lieu des variables, de sorte que vous obtenez probablement un record avec rien affecté, et par conséquent aucune association:

@favorite = Favorite.new(:entry_id => params[:entry_id], :user_id => params[:user_id]) 

Cela devrait gérer les associations reliant si vous avez belongs_to défini.

Gardez à l'esprit que :user_id est simplement un symbole, rien de plus, où user_id est une variable et params[:user_id] est le paramètre qui peut avoir été transmis. Les symboles sont souvent utilisés comme clés de hachage, car ils sont très légers et facile à comparer. Pour des raisons de cohérence, essayez de transmettre les paramètres de type _id avec le _id à la fin. Dans ce cas, ce serait:

<%= link_to_remote "+", 
    :url => { :action => 'add_favorite' }, 
    :entry_id => entry.id, 
    :user_id => session[:user_id], 
    :update => 'favorite_' + entry.id.to_s 
%> 
+1

Merci tadman! L'autre moitié de la solution devait inclure: entry_id et: user_id dans le cadre de l'URL (: url => {ici}). – txpost

+0

Vous avez raison aussi sur ce compte. N'oubliez pas que de nombreux modèles peuvent avoir une méthode '# to_param' personnalisée que vous devriez utiliser à la place de' # id'. Le seul endroit où l'utilisation de '# id' est approprié est comme un identifiant unique, comme pour votre ID DOM, ou lors de la construction de SQL. Pour les URL, utilisez toujours '# to_param'. – tadman

Questions connexes