提问人:Jens Schmidt 提问时间:10/5/2016 更新时间:10/6/2016 访问量:1563
Javascript 未执行
Javascript is not executed
问:
我无法弄清楚,为什么我的 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
<%= 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中尝试了“page:change”和“turbolinks:load”(而不是“ajax:success”)。我尝试了“_uploadform.js.erb”(而不是“upload.js.erb”)中的所有 Java-Ready 函数。我在 link_to (show.html.erb) 中尝试了“remote: true” - 但后来它只执行 js.erb(只是出现了警报)。我还将 Rails 从 4.2.1 更新到 4.2.7.1,并在 application.js 中尝试了“//= require jquery.turbolinks”(使用上述所有文档就绪功能)。
正如您在我的日志中看到的那样,它似乎没有使用 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)
请帮帮我。我不明白为什么这无论如何都不起作用。
答:
你需要告诉 rails 通过 JavaScript 执行表单的 post。在日志中,您可以看到 PagesController 正在呈现 HTML 而不是 JS
Processing by ProjectsController#upload as HTML
尝试将 :remote => true 添加到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 轨指南。
评论
您似乎正在尝试使用 AJAX 请求上传文件,要求表单定义使用 :multipart => true 和 :remote => true。
文件上传无法使用远程完成,但是通过使用 Remotipart gem 可以轻松解决此问题 - 它支持上传 AJAX 文件,而无需对代码进行任何进一步的更改。
- 将 gem 'remotipart' 添加到您的 Gemfile
- 添加 //= require jquery.remotipart to application.js (after jquery_ujs)
- 在表单声明中使用 remote: true 和 multipart: true
您现在应该能够异步上传文件。
欲了解更多信息,请查看 https://github.com/JangoSteve/remotipart
评论
ajax:success
$(document).ajaxSuccess
jquery_ujs
jquery
application.js