2009-08-01 6 views
2

Dans un projet Ruby on Rails, une fonction JavaScript doit être exécutée à la fin d'un appel Ajax. Mon problème est que les valeurs passées dans la fonction JavaScript appelée avec page.call sont enveloppées entre guillemets. Pas trop de problème si vous passez des chaînes mais l'une des valeurs est une représentation sous forme de chaîne d'un tableau JavaScript, c'est-à-dire [0,1,2,3].Passer des objets de Rails RJS à un appel de fonction javascript sans en indiquer les valeurs?

Voici ce que je pense être les extraits de code importants.

J'ai un observ_field qui regarde une liste déroulante de sélection.

<%= observe_field("project_select_list", 
    :loading => "Element.show('tree_indicator')", 
    :complete => "Element.hide('tree_indicator')", 
    :url => {:controller => "projects", :action => "change_project"}, 
    :with => "id") 
%> 

Dans le project_controller

def change_project() 
    @current_project = Project.find(params[:id]) 
end 

Et dans change_project.rjs

page.replace_html("project_name", @current_project.name) 
page.visual_effect(:highlight, "project_name") 
page.call("buildYUITreeView", "project_tree", @current_project.get_directory_contents(@current_project.local_path, 0)) 

La dernière valeur:

@current_project.get_directory_contents(@current_project.local_path, 0)) 

est ce qui me cause des problèmes. Je veux juste qu'il envoie la valeur, par exemple [0,1,2,3], mais il envoie "[0,1,2,3]" qui fait sauter le JS.

Ce partiel fait ce qu'il est censé faire en ce sens qu'il envoie les données et non une chaîne au code JavaScript qui est placé sur la page.

<% javascript_tag do -%> 
    YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("<%= tree_id %>", <%= project.get_directory_contents(project.local_path, 0) %>)); 
<% end -%> 

Dans cet esprit, je suis jouer avec l'aide d'une partielle et juste rendre appeler la fonction JS quand je dois, mais cela semble être un hack.

Comment faire pour que page.call n'enveloppe pas les données envoyées comme des paramètres entre guillemets, ou comment dois-je faire pour transmettre ces données à la fonction JS pour exécution après la fin de l'appel Ajax?

Répondre

4

Tom était sur la bonne voie, la méthode << est le chemin à parcourir, car il insérera tout javascript directement. Vous aurez besoin de l'utiliser au lieu de call.

page << "buildUYITreeView('project_tree', #{@current_project.get_directory_contents(@current_project.local_path, 0))})" 

Vous pouvez faire la même chose avec la ligne YAHOO que Tom a montré qui devrait être plus efficace que d'utiliser une partie avec une étiquette javascript.

1

Vous pouvez utiliser la méthode à la place < < pour émettre javascript brut:

page << 'YAHOO.util.Event.addListener("dom:loaded", "load", buildYUITreeView("project_tree", '[email protected]_project.get_directory_contents(@current_project.local_path, 0)+'))' 
+0

Merci pour la réponse, mais .. Je pense que vous avez échoué à répondre à la bonne question. Mon problème est avec le page.call ("buildYUITreeView", "project_tree", @ current_project.get_directory_contents (@ current_project.local_path, 0)) appel dans le fichier RJS pas dans le partiel. –

+0

Ok, gotcha. Désolé je n'ai pas lu assez près. Modifier la réponse – tom

Questions connexes