2014-07-11 9 views
1

Ainsi la façon dont on m'a enseigné initialement pour implémenter ajax dans mes applications rails est de créer un fichier js pour chaque action par contrôleur, puis de référencer ce fichier js dans le répond_to bloc.Renvoyer javascript du contrôleur sans action js fichier spécifique

Ceci est vraiment embêtant, et j'aime inclure tout mon javascript dans un seul fichier main.js, c'est-à-dire ne pas compartimentaliser chaque extrait.

Cela a bien fonctionné jusqu'à présent, sauf lorsque je veux passer un objet à la fonction appropriée.

Voici comment je suis censé gérer la demande ajax pour créer une nouvelle liste d'utilisateurs dans mon application:

<%= form_for @client, action: :create, remote: true do |f| %> 
    <%= f.text_field :firstname, placeholder: 'First Name' %> 
    <%= f.text_field :lastname, placeholder: 'Last Name' %> 
    <%= f.hidden_field :status, value: true %> 
    <%= submit_tag :create %> 
<% end %> 

.... formulaire est la télécommande: tag vrai.

def create 
    @client = current_trainer.clients.create(client_params) 
    respond_to do |format| 
    format.html { redirect_to clients_path } 
    format.js 
    end 
end 

.... créer une action passe par défaut réponse à créer le fichier:

$('.active').prepend("<%= j render @client %>"); 

C'est bien beau. Mais je n'aime pas cette configuration. Je veux faire un appel comme celui-ci à la place:

def create 
    @client = current_trainer.clients.create(client_params) 
    respond_to do |format| 
    format.html { redirect_to clients_path } 
    format.js { render js: "theApp.clientsPage.saveClient();" } 
    end 
end   

.... puis dans le fichier main.js.erb je:

saveClient: function() { 
     $('.active').prepend("<%= j render @client %>"); 
    }, 

mais l'erreur que je reçois est le suivant:

undefined method `render' for #<#<Class:0x007fd278f350c8>:0x007fd27b182298> 

Répondre

0

main.js.erb y compris que dans la mise en page Je pense, oui? Ensuite, il compile au lancement (par exemple ce formulaire sur votre action main#index) index action et vous n'avez pas @client.

juste donner un argument à saveClient fonction, comme ceci:

saveClient: function(newElement) { 
    $(".active").prepend(newElement); 
}, 

Et puis dans create appel d'action:

format.js { render js: "theApp.clientsPage.saveClient($(\"<div>#{ j render @client }</div>\"));" } 
+0

C'est plus proche que je pense, mais pas de cigare. Il ajoute littéralement le texte '<% = j render @client%>' au lieu du code à évaluer. –

+0

@ ninja08 sûr, désolé. Ça doit être "# {...}" bien sûr. Et mieux ajouter un bloc et pas de texte, par exemple 'div'. – ostapische

+0

Merci, même si cela ne fonctionne pas non plus. –

Questions connexes