2010-10-19 13 views
0

J'ai dans mon assistant d'application une méthode destinée à désactiver une tâche dans ma base de données.rails: données en cours de suppression lors du rechargement de la page

aide Application:

def link_to_destroy_task(task_id) 
    Task.find(task_id).deactivate 
    end 

Modèle:

def self.deactivate() 
    update_attribute(:active, false) 
end 

Vue:

<ol id="tasks"> 
    <% @Tasks.each do |task| %> 
     <%content_tag_for :li, task do %> 
     <span class ="handle"> [drag] </span> 
     <%= link_to task.name, :controller => "com_tasks", :action => "edit", :id => task.id %> 
     <%= link_to_function '[Delete]', link_to_destroy_task(task.id) %> 
    <% end %> 
    <% end %> 
</ol> 

Pour une raison quelconque quand la page se charge, il supprime tout de la liste. Pas seulement basculer actif sur faux. Il l'efface complètement de la base de données.

J'utilise des appareils, donc je recharger toutes les données de test, et je peux rafraîchir une fois pour voir les données à nouveau, mais la prochaine fois que je le recharger est parti.

J'ai changé le nom de la méthode pour « désactiver » parce que je pense que détruire est déjà pris, mais la méthode est toujours en cours d'exécution sans être cliqué. Il ne supprime plus, mais il désactive tout.

Répondre

1

Cela se produit parce que vous appelez deactivate dans votre vue pour chaque article! Le deuxième paramètre de votre fonction link_to_function exécute la désactivation réelle.

Je pense que vous avez mal compris link_to_function - il ne fonctionne pas une fonction ruby ​​lorsque vous cliquez dessus, il fonctionne une fonction javascript que vous avez créé. Le deuxième paramètre doit être une chaîne contenant une fonction javascript. Rails n'aurait aucun moyen d'exécuter une méthode ruby ​​dans le navigateur de quelqu'un.

Voici un lien vers la documentation, ce qui devrait vous mettre sur la bonne voie:

http://apidock.com/rails/ActionView/Helpers/JavaScriptHelper/link_to_function

+0

OHK. Je l'avais initialement dans le contrôleur que je pensais que je devais le déplacer vers un assistant. Est-il possible de créer un lien vers une action dans le contrôleur d'application? Je voulais qu'il soit disponible à partir de différentes vues de différents contrôleurs. Et je ne pensais pas que la réplication du code était une bonne idée – Rumpleteaser

1

attention à cette ligne

<%= link_to_function '[Delete]', link_to_destroy_task(task.id) %> 

que vous exécutez en fait fonction link_to_destroy_task ici, une fois pour chaque tâche.

De la documentation

def link_to_function (nom, * args, & bloc)
Renvoie un lien du nom donné + + qui déclenchera une fonction JavaScript + + en utilisant le gestionnaire onclick et return false après le fait.

jamais utilisé cette méthode, mais il semble son but est d'invoquer la fonction JavaScript, Ruby ne fonctionne pas.
Il y a aussi des exemples.