2010-11-19 2 views
30

Je ne sais pas pourquoi je suis rails d'apprentissage et je suis un livre, il dit de le faire comme cela ne fonctionne pas, ceci:Rails form_for: distance => true ne demande pas la méthode js

<%= form_for([@article,@article.comments.new ], :remote=>true, :html => {:style=>'display: none;' }) do |f|%> 
    <div class="field"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :body %> 
     <%= f.text_area :body %> 
    </div> 
    <%= f.submit %> 
<% end %> 

Cependant, cela ne fonctionne pas, et quand je vérifie la demande dans firebug l'URL ne se termine pas par .js, avez-vous des idées pourquoi?

+0

pouvez-vous ajouter selon les méthodes du contrôleur (par exemple.index, créer, nouveau) et les fichiers de vue connexes ici, afin que nous puissions voir l'image entière? – Ingo

Répondre

-11

Change:

[@article,@article.comments.new ] 

pour

@article 

Je vous suggère de lire l'API sur la section concernée: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

+2

ryudice est à la recherche d'un nouveau formulaire pour l'article ryudice. L'appel form_for de ryudice est la syntaxe correcte pour ce que ryudice veut. Votre suggestion serait bien pour un formulaire d'article standard. C'est déroutant, parce que le contexte n'est jamais énoncé. – natedavisolds

32

Lorsque vous vérifiez la demande à Firebug, juste parce que l'url ne s'est pas terminé avec .js, cela ne signifie pas qu'il n'a pas été appelé depuis javascript. Pour vérifier que vous devez vérifier l'en-tête de demande pour voir ce qu'est le paramètre Accept. S'il est dit "application/javascript" alors tout va bien.

Deuxièmement, un problème très courant lors du démarrage de: remote => true est que les bibliothèques javascript requises ne sont pas incluses dans votre code. Donc, je suppose que le code suivant est absent de votre mise en page:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

Si tel est le cas, il suffit d'inclure à l'intérieur de la balise <head> de votre mise en page. Il est fort probable que le fichier rails.js, qui gère cela pour vous, que vous utilisiez le prototype ou le jquery, ne vous contienne probablement pas le fichier

+0

voulez-vous dire par "en-tête html" l'étiquette de tête du modèle où le formulaire/lien avec la télécommande: vrai est? – Timo

+0

Oui, merci de l'avoir signalé. Ce n'était pas si clair. Mais oui, il devrait être inclus à l'intérieur de tag – DanneManne

21

Si vous utilisez jQuery, la manière la plus simple d'obtenir tous les fichiers requis est d'utiliser la gemme jquery-rails. Cela va ajouter un générateur pour installer jquery et les rails.js nécessaires.

taper quelque chose comme dans votre rails racine de l'application:

rails g jquery:install 

Et puis, à l'intérieur de votre application.html.erb ajoutez la ligne

<%= javascript_include_tag :defaults %> 

ou explicitement (ne pas oublier d'inclure votre jquery séparément):

<%= javascript_include_tag :rails, :application %> 

[MODIFIER: pour Rails 3.1 ou supérieur utilisant l'actif pipeline]

Utilisez la pierre précieuse jquery-rails (comme mentionné ci-dessus) et ajouter les lignes suivantes à la app/assets/javascripts/application.js (si elles ne sont pas déjà):

//= require jquery 
//= require jquery_ujs 

Hope this helps!

+0

cela a bien fonctionné .. Merci .. – Neo

+0

Nous avons eu ce problème, mais nous avons inclus 'jquery_ujs.js' pour le réparer. –

+0

Oui, c'est vrai, ça a un peu changé avec les rails 3.1 et le pipeline d'actifs. J'ai mis à jour ma réponse pour refléter cela. – nathanvda

4

Vérifiez le contrôleur: at-il un respond_to block?

Si vous avez généré votre application avec des rails échafaudage génèrent, il aura quelque chose comme

respond_to do |format| 
     format.html 
     format.xml { .... } 
    end 

Si elle ne l'avoir, prenez tout le bloc dehors, de respond_to à la fin; ou remplacer alternativement le bloc entier avec une seule ligne

respond_to :html, :js 

ou bien modifier le bloc en ajoutant la ligne supplémentaire montré ici

respond_to do |format| 
     format.html 
     format.js 
     format.xml { .... } 
    end 

Ou devrait fonctionner dans votre cas.

4

Vérifiez votre fichier /app/assets/javascript/application.js

Il devrait être inclus ci-dessous les fichiers là-dedans. jquery_ujs est responsable du fonctionnement remote=> true fonctionnalité.

require `jquery` 
require `jquery_ujs` 

Codage heureux !!

+1

J'ai eu un problème de newbie similaire en suivant 'Agile Web Development with Rails', sur' chapitre 11.2 itération F2: Création d'un chariot basé sur AJAX'. Le problème est résolu par uncomment '= require jquery' dans le fichier que vous avez listé. J'espère que cela aide les autres. –

+0

C'est génial @cppinitiator! –

6

Cette erreur se produit lorsque vous n'avez pas ajouté le fichier jquery_ujs. Vous venez d'inclure le fichier jquery.

Vous devez donc ajouter les fichiers manuellement en vous affichez ou avez besoin d'eux dans application.js ou tout autre fichier que vous utilisez pour la mise en page spécifique . Selon votre scénario, vous pouvez suivre la 1ère ou la 2ème solution.

1ère solution:

<%= javascript_include_tag :jquery, :jquery_ujs %> 

2ème solution:

  1. exigent à la fois jquery et jquery_ujs dans app/assets/application.js

    //= require jquery.js 
    
    //= require jquery_ujs 
    
  2. Incluez le fichier application.js dans votre fichier layout.

    <%= javascript_include_tag :application %> 
    

Note:

ajouter également tag CSRF dans le fichier de mise en page pour les deux solutions. Je suppose que vous avez le code ci-dessous dans votre Gemfile et que vous avez déjà installé ce Gem.

gem 'jquery-rails' 
+0

La deuxième solution a résolu mon problème! –

Questions connexes