Pourquoi est-rails de ne pas rendant la .js.erb fichier?
J'ai une application rails, où je suis en train d'avoir jQuery rendu AVEC un fichier HTML. Le point de ce que l'jQuery est spécifique à la page donc je ne veux pas qu'il le chargement de chaque page en le mettant dans l'en-tête. Voici ce que j'ai fait pour les fichiers
messages_controller.rb
# GET /messages/new
def new
@message = Message.new
@users = User.where('id != ' + current_user.id.to_s)
#if @message.save
#MessageMailer.new_message(@message).deliver
respond_to do |format|
format.html # new.html.erb
format.js
end
#end
end
/messages/nouveau.html.erb
<div class="row">
<div class="large-12 columns">
<div class="panel">
<h1>New message</h1>
<%= render 'form' %>
<%= link_to 'Back', messages_path, :class => "button small" %>
</div>
</div>
</div>
/messages/nouveau.js.erb
$("h1").html('hello'); //for testing that it works
Il y a une chose que j'ai à ajouter à un autre fichier? Est-il une demande que j'ai à faire en sorte qu'il se charge à la fois le HTML et .js?
En plus des réponses, vous devez lire ce post : stackoverflow.com/questions/6167805/...
C'est l'insécurité
C'est l'insécurité
User.where('id != ' + current_user.id.to_s)
. Utilisation User.where('id != ?', current_user.id.to_s)
à la place.OriginalL'auteur nwestfall | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Pourquoi cela ne fonctionne pas?
Je ne pense pas que votre méthode est particulièrement méthode standard pour accomplir ce que vous voulez. La raison pour laquelle votre JS modèle n'est pas en cours de chargement est parce que votre contrôleur est configuré pour répondre avec un modèle HTML, si les requêtes du navigateur HTML, et un modèle de JS, si le navigateur demande JS. Il ne reviendra jamais à la fois parce que le navigateur ne peut demander à un ou l'autre.
En d'autres termes, le bloc respond_to dans votre contrôleur est en instruisant le contrôleur de façon à répondre aux demandes de différents types de contenu, et non une liste de tous les types de contenu qui sera envoyé, à chaque requête.
Solution 1: Charger le JS sur chaque page
Il ya un couple de choses à considérer ici. Tout d'abord, tout simplement parce que JS n'est pas utilisé sur une page en particulier, n'est pas, en soi, une bonne raison de ne pas le charger. Rails, via des Pignons, concaténer et rapetisser l'ensemble de vos JS dans un seul fichier. Aussi longtemps que ce fichier ne change pas, il sera mis en cache par le navigateur d'un utilisateur. Cela aura pour résultat une réponse plus rapide lorsque votre utilisateur visite une page qui n'a besoin de cette JS, puisqu'il n'aura pas besoin de faire une requête supplémentaire afin d'obtenir le nouveau JS.
Si vous êtes préoccupé par votre JS en cours d'exécution sur le contenu qu'il ne devrait pas, alors vous devriez vraiment garder à l'encontre de ce par l'ajout d'un identifiant unique de la page ou des pages, sur lequel vous souhaitez exécuter, puis la détection de cet identifiant dans votre JS. Par exemple:
Solution 2: Utiliser content_for
Cependant, il existe certaines situations dans lesquelles il pourrait être bénéfique pour charger JS séparément. Le meilleur moyen d'y arriver, à mon avis, est d'avoir un contenu pour le bloc qui ajoute du contenu à votre tête, si une personne doit.
Donc à votre disposition d'application:
messages_new.js ensuite seulement inclus, et, par conséquent, exécuter, sur les points de vue où vous incluez également content_for bloc. Il ne doit pas apparaître sur n'importe quelle autre page.
Solution 3: il suffit d'inclure le code javascript dans le html,
Alternativement, si vous n'avez pas de soins si le JS est chargé dernier, alors vous pouvez simplement ajouter le comprennent l'aide à la fin de la nouvelle.html.erb:
OriginalL'auteur Rupert Madden-Abbott
De ce que je comprends, vous voulez avoir new.html et new.js pour être servi lors de la demande d' /messages/new.
Il ne fonctionnera pas, les rails contrôleur utilisera js ou HTML et jamais les deux.
HTTP ne fonctionne pas comme ça. Vous n'avez qu'un seul fichier qui est envoyé en réponse à une requête HTTP et vous ne pouvez pas envoyer 2 en même temps.
Le but de la respond_to bloc de l'action est d'utiliser html pour la demande html classique (navigation) et js lorsque la demande est pour le js, et c'est ce que vous utilisez pour l'ajax.
Pour ce que vous voulez, vous devez ajouter un js de référence dans votre erb, il n'y a pas d'autre moyen.
OriginalL'auteur Syl
Désolé je suis en retard, mais vous pouvez appeler au JavaScript "/messages/nouveau.js.erb" à l'aide de:
messages/nouveau.html.erb
link_to "Lien", "", à distance: vrai
Toutes les fois que vous cliquez sur ce lien, cela va déclencher "/messages/nouveau.js.erb".
OriginalL'auteur kizziah
Javascript code sera exécuté à partir de votre code html.erb fichier si vous l'envelopper dans des balises de script. Si c'est pour des fins de test uniquement et seulement temporaire, cela pourrait être un moyen facile et rapide de mettre le feu à votre jquery avec votre code html plutôt que de créer un nouveau fichier séparé.
OriginalL'auteur PJL