0

Я не могу понять, почему мой javascript не выполнен (и его действительно не выполняется).Javascript не исполняется

/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"); 
}); 

Я попробовал все. Я добавил и удалил «{render layout: false}» в моем контроллере. Я попробовал «page: change» и «turbolinks: load» в моем upload.js.erb (вместо «ajax: success»). Я пробовал все функции Java-Ready в «_uploadform.js.erb» (вместо «upload.js.erb»). Я попробовал «remote: true» в link_to (show.html.erb) - но тогда он выполняет только js.erb (только появилось предупреждение). Я также обновил Rails с 4.2.1 до 4.2.7.1 и попытался «// = потребовать jquery.turbolinks» в application.js (со всеми вышеперечисленными функциями документа).

Как вы можете увидеть в моем журнале, кажется, что оно не реагирует с 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) 

Пожалуйста, помогите мне. Я не понимаю, почему это никоим образом не работает.

+0

Я не думаю, что есть 'Аякс: success' селектор. Вы имели в виду '$ (document) .ajaxSuccess' – vlaz

+0

Нет. Я не знаю, где это получить, но он не работает с« turbolinks: load »и« страница: change ». Итак, да, возможно, «ajax: success» ошибочен, но другие селекторы тоже не работают. –

+0

Я не знаю, имеет ли он какое-либо значение, но попытайтесь загрузить 'jquery_ujs' после' jquery' в ваш 'application.js' –

ответ

0

Вам необходимо указать рельсы, чтобы выполнить пост формы с помощью JavaScript. В журнале вы можете увидеть PagesController является оказание HTML и не JS

Processing by ProjectsController#upload as HTML

Попробуйте добавить: удалённое => верно для вашего 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 %>

Смотрите рельсы направляющие http://guides.rubyonrails.org/working_with_javascript_in_rails.html#form-for для более Информация.

+0

К сожалению, это тоже не работает. Я также пытался переместить вещи из «upload.js.erb» в «_uploadform.js.erb», но в журналах я вижу, что его все еще отображается в HTML вместо JS, хотя у меня есть data-remote = " true "в HTML моей формы. Любые другие идеи? –

+0

Я узнал, что если я установил «defaults: {: format => 'js'}" в моих маршрутах.rb, мне нужно создать исключение из Forgery (protect_from_forgery, за исключением:: upload) из-за ошибки: «Предупреждение о безопасности: встроенный тег

0

По-видимому, вы пытаетесь загрузить файлы с запросом AJAX, для чего требуется: multipart => true и: remote => true для определения вашей формы.

Загрузка файлов не может быть выполнена с использованием пульта дистанционного управления, однако эта проблема легко устраняется с помощью Remotipart gem - она ​​позволяет загружать файлы AJAX без каких-либо изменений в ваш код.

  1. Добавить камень 'remotipart' на ваш Gemfile
  2. Добавить // = требуют jquery.remotipart к применению.JS (после jquery_ujs)
  3. Использование удаленных: истинный и многокомпонентные: истинные в вашей форме декларации

Теперь вы должны иметь возможность асинхронно загружать файлы.

Для получения дополнительной информации ознакомьтесь с https://github.com/JangoSteve/remotipart

+0

На самом деле я пытаюсь использовать Boostrap Design для кнопки Filebrowser. Невозможно ли иметь Javascript (чтобы делать что-то после загрузки страницы) в этой ситуации? –

+0

Ну, это именно то, что делает remotipart дает вам. Я обновил свой ответ с более ясными инструкциями – David

+0

Спасибо, но он не работает так, как я ожидал. Возможно, я не понял, что я пытаюсь выполнить. Я хотел бы выполнить javascr ipt, когда мой просмотр с моей кнопкой «просмотр файла» (вид с формой на нем) закончен, загрузка - не после того, как я что-то загрузил. Даже с remotipart, мой javascript не выполняется в этот момент. –