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}を追加して削除しました。 upload.js.erbに "ajax:success"の代わりに "page:change"と "turbolinks:load"を試しました。私は "upload.js.erb"の代わりに "_uploadform.js.erb"でJava-Ready機能をすべて試しました。私はlink_to(show.html.erb)で "remote:true"を試みましたが、js.erb(alertだけが出てきました)を実行します。また、Railsを4.2.1から4.2.7.1に更新し、application.jsで "// = require jquery.turbolinks"を試しました(上記のすべてのドキュメント準備関数を使用しています)。

あなたは私のログに見ることができるように、それはJavascriptで応答doesntのようだ:

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

「ajax:success」セレクタはありません。あなたは '$(document).ajaxSuccess'を意味しましたか? – vlaz

+0

いいえ、私はどこでそれを得るのか分かりませんが、" turbolinks:load "や" page:change "で動作しません。だから、おそらく "ajax:success"は間違っていますが、他のセレクタもうまくいきません。 –

+0

私はそれが何か違いがあるかどうか分かりませんが、 'application.js'の' jquery'の後に 'jquery_ujs'をロードしようとします。 –

答えて

0

JavaScript経由でフォームの投稿を実行するには、railsに指示する必要があります。

はレールがより多くのためにhttp://guides.rubyonrails.org/working_with_javascript_in_rails.html#form-forをガイドを参照してください。リモート=>あなたの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 %>

を:あなたはをPagesControllerがHTMLをレンダリングしないJS

Processing by ProjectsController#upload as HTML

てみ追加され見ることができますログに情報。

+0

悲しいことに、これもうまくいきません。私はまた、 "upload.js.erb"から "_uploadform.js.erb"に物事を移動しようとしましたが、ログには、JSの代わりにHTMLでレンダリングされていることがわかりました。私のフォームのHTMLでは「true」です。他のアイデアは? –

+0

私は、もし私が "defaults:{:format => 'js'}"をroutes.rbに設定すると、エラーのために偽造(protect_from_forgery::upload:を除いて例外を作成しなければならないことがわかりました。 "セキュリティ警告:別のサイトの

0

AJAXリクエストでファイルをアップロードしようとしていますが、フォーム定義には:multipart => trueと:remote => trueが必要です。

リモートでファイルのアップロードを行うことはできませんが、Remotipart gemを使用することでこの問題は簡単に解決されます。コードを変更せずにAJAXファイルをアップロードできます。

  1. あなたのGemfileに宝石 'remotipart'を追加
  2. // =アプリケーションにjquery.remotipartを必要とします。
  3. 使用リモート(jquery_ujs後)JS:真マルチパート:フォームの宣言

本当のあなたは今、非同期にファイルをアップロードすることができるはずです。

詳細はこちらhttps://github.com/JangoSteve/remotipart

+0

実際に私はファイルブラウザボタンのためにBoostrap Designを使用しようとしていますが、この状況でJa​​vascriptを読み込むことはできませんか? –

+0

これはまさにremotipartです私は答えを明確に指示して更新しました – David

+0

ありがとうございましたが、期待通りに機能していませんでした。私は何を達成しようとしているのか分かりませんでした。私は私の "ファイルブラウズ"ボタン(私が何かをアップロードした後ではなく、その上にform_forを持つビュー)の読み込みが終了したときにiptを表示します。 remotipartでさえ、私のjavascriptはその時点で実行されません。 –

関連する問題