0

Je n'arrive pas à comprendre, pourquoi mon javascript n'est pas exécuté (et ce n'est vraiment pas exécuté).Javascript n'est pas exécuté

/app/assets/javascripts/application.js:

//= require jquery 
//= require bootstrap-sprockets 
//= require turbolinks 
//= require jquery_ujs 
//= require_tree . 

/app/controllers/project_controller.rb:

def upload 
    @projects = Project.all.order(updated_at: :desc) 
    @project = Project.find(params[:id]) 
    respond_to do |format| 
     format.html 
     format.js {render layout: false} 
    end 
end 

/app/views/projects/show.html.erb :

<%= link_to project_upload_path, :project => @project.id, class: "btn btn-default" do %> 
    Upload &nbsp; 
    <%= glyph("plus") %> 
<% end %> 

/app/views/projects/upload.html.erb:

<div class="row"> 
    <div class="col-xs-12"> 
     <h2>Upload File to <%= @project.name %> project</h1> 
    </div> 
    <br> 
    <div class="col-xs-12"> 
     <%= render :partial => "uploadform", :action => "savefile" %> 
    </div> 
</div> 

/app/views/projects/_uploadform.html.erb:

<%= form_for :upload, url: {action: "savefile"}, :multipart => true do |f| %> 
    <%= f.hidden_field(:project_id, :value => params[:id]) %> 
    <%= f.file_field :file, input_html: { hidden: true }, label: 'Upload Attachment' %> 
    <input id="file-display" class="input-large uneditable-input" type="text"> 
    <%= f.submit "Save File", :class => "btn btn-default btn-file", :id => "upload-btn" %> 
<% end %> 

/app/views/projects/upload.js.erb:

$(document).on('ajax:success', function() { 
    alert("Test"); 
}); 

J'ai tout essayé. J'ai ajouté et supprimé "{layout: false}" dans mon contrôleur. J'ai essayé "page: changer" et "turbolinks: charger" dans mon upload.js.erb (au lieu de "ajax: succès"). J'ai essayé toutes les fonctions Java-Ready dans "_uploadform.js.erb" (au lieu de "upload.js.erb"). J'ai essayé "remote: true" dans link_to (show.html.erb) - mais ensuite il n'exécute que js.erb (juste l'alerte est apparue). J'ai également mis à jour Rails de 4.2.1 à 4.2.7.1 et essayé "// = require jquery.turbolinks" dans application.js (avec toutes les fonctions de document prêt ci-dessus).

Comme vous pouvez le voir dans mon journal, il semble qu'il ne marche pas répondre avec le Javascript:

Started GET "/projects/upload/20" for 127.0.0.1 at 2016-10-05 14:05:48 +0200 
Processing by ProjectsController#upload as HTML 
    Parameters: {"id"=>"20"} 
    Project Load (0.0ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT 1 [["id", 20]] 
    Rendered projects/_uploadform.html.erb (0.0ms) 
    Rendered projects/upload.html.erb within layouts/application (2.4ms) 
Completed 200 OK in 327ms (Views: 324.8ms | ActiveRecord: 0.0ms) 

S'il vous plaît aidez-moi. Je ne comprends pas pourquoi cela ne fonctionne pas du tout.

+0

Je ne pense pas qu'il y ait un 'ajax: sélecteur Success'. Vouliez-vous dire '$ (document) .ajaxSuccess' – vlaz

+0

Non. Je ne sais pas d'où je viens, mais ça ne marche pas avec" turbolinks: load "ni" page: change ", aussi. Donc, oui, peut-être "ajax: le succès" est faux, mais les autres sélecteurs ne fonctionne pas trop. –

+0

Je ne sais pas si cela a une différence, mais essayez de charger 'jquery_ujs' après' jquery' dans votre 'application.js' –

Répondre

0

Vous devez indiquer à des rails d'exécuter le message du formulaire via JavaScript. Dans le journal, vous pouvez voir le PagesController est rendu HTML et non JS

Processing by ProjectsController#upload as HTML

Essayez d'ajouter: distance => true à votre aide form_for

<%= form_for :upload, url: {action: "savefile"}, :multipart => true, :remote => true do |f| %> <%= f.hidden_field(:project_id, :value => params[:id]) %> <%= f.file_field :file, input_html: { hidden: true }, label: 'Upload Attachment' %> <input id="file-display" class="input-large uneditable-input" type="text"> <%= f.submit "Save File", :class => "btn btn-default btn-file", :id => "upload-btn" %> <% end %>

Voir les rails guides http://guides.rubyonrails.org/working_with_javascript_in_rails.html#form-for pour plus information.

+0

Malheureusement, cela ne fonctionne pas, aussi. J'ai également essayé de déplacer les choses de "upload.js.erb" à "_uploadform.js.erb" - mais dans les logs, je peux voir, que c'est toujours rendu en HTML au lieu de JS même si j'ai data-remote = " true "en HTML de mon formulaire. D'autres idées? –

+0

J'ai découvert que si je définissais "defaults: {: format => 'js'}" dans mes routes.rb, que je devais créer une exception à partir de Forgery (protect_from_forgery sauf:: upload ", à cause d'une erreur: "Avertissement de sécurité: une balise

0

Il semble que vous essayez de télécharger des fichiers avec une requête AJAX, ce qui nécessite: multipart => true et: remote => true pour votre définition de formulaire.

Les téléchargements de fichiers ne peuvent pas être effectués à distance, mais ce problème est facilement résolu en utilisant Remotipart gem - il permet le téléchargement de fichiers AJAX sans autre modification de votre code.

  1. Ajouter bijou 'remotipart' à votre Gemfile
  2. Ajouter // = jquery.remotipart à nécessitent l'application.js (après jquery_ujs)
  3. Utilisez à distance: true et multipart: true dans votre formulaire de déclaration

Vous devriez maintenant être en mesure de télécharger des fichiers de manière asynchrone.

Pour plus d'information, consultez https://github.com/JangoSteve/remotipart

+0

En fait, j'essaie d'utiliser Boostrap Design pour le bouton Filebrowser Est-il pas possible d'avoir un Javascript (pour faire quoi que ce soit après le chargement de la page) dans cette situation –

+0

Eh bien c'est exactement ce que le remotipart J'ai mis à jour ma réponse avec des instructions plus claires – David

+0

Merci, mais ça ne marche pas comme je m'y attendais Peut-être que je n'étais pas clair sur ce que j'essayais d'accomplir, je voudrais exécuter un javascr ipt quand mon point de vue avec mon bouton "parcourir le fichier" (la vue avec le formulaire_for dessus) est fini le chargement - pas après avoir téléchargé quelque chose. Même avec remotipart, mon javascript n'est pas exécuté à ce moment-là. –