【问题标题】:Javascript is not executedJavascript 未执行
【发布时间】:2017-02-13 22:03:19
【问题描述】:

我不知道为什么我的 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 中尝试了“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)

请帮助我。我不明白为什么这不起作用。

【问题讨论】:

  • 我认为没有ajax:success 选择器。你是说$(document).ajaxSuccess
  • 没有。我不知道我从哪里得到的,但它也不适用于“turbolinks:load”或“page:change”。所以,是的,也许“ajax:success”是错误的,但其他选择器也不起作用。
  • 不知道有什么区别,但是尝试在你的jquery之后加载jquery_ujsapplication.js
  • 不,遗憾的是这并没有帮助(即使很难,我只是在 jquery_ujs 之后加载了 jquery(因为我认为我已经在 jquery 之后加载了 jquery_ujs))。

标签: javascript ruby-on-rails ruby-on-rails-4 turbolinks unobtrusive-javascript


【解决方案1】:

您似乎正在尝试使用 AJAX 请求上传文件,您的表单定义需要 :multipart => true 和 :remote => true。

无法使用远程完成文件上传,但使用 Remotipart gem 可以轻松解决此问题 - 它无需对代码进行任何进一步更改即可启用 AJAX 文件上传。

  1. gem 'remotipart' 添加到您的 Gemfile 中
  2. //= 要求 jquery.remotipart 添加到 application.js(在 jquery_ujs 之后)
  3. 在表单声明中使用 remote: truemultipart: true

您现在应该可以异步上传文件了。

更多信息请查看https://github.com/JangoSteve/remotipart

【讨论】:

  • 实际上我尝试对文件浏览器按钮使用 Boostrap 设计。在这种情况下是否不可能有 Javascript(在页面加载后执行任何操作)?
  • 这正是 remotipart 为您提供的。我用更清晰的说明更新了我的答案
  • 谢谢你,但它没有像我预期的那样工作。也许我不清楚我想要完成什么。当我的“文件浏览”按钮的视图(上面带有 form_for 的视图)完成加载时,我想执行一个 javascript - 而不是在我上传某些内容之后。即使使用 remotipart,我的 javascript 也不会在那时执行。
  • 如果我理解正确,您正在尝试呈现上传表单并在 upload.js.erb 中运行代码。 Rails 不是这样工作的。 upload.js.erb 是由于对控制器的上传操作的 AJAX 调用而呈现的,而 upload.html.erb 是由于对控制器的上传操作的 HTML 调用而呈现的(不是两者)。您在 show.html.erb 中的链接是直接的 html 调用,因此上传通过呈现 upload.html.erb 来响应。如果您想在页面加载时调用 (jquery),只需嵌入 $(document).ready(function() {...});在 html.erb 文件中的
  • 在这种情况下,我想,我过去被一些教程误导了——我认为,内联脚本是一个坏主意,而不是 Rails 方式。当然,它的工作原理。非常感谢!
【解决方案2】:

您需要告诉 rails 通过 JavaScript 执行表单的发布。在日志中你可以看到 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

【讨论】:

  • 遗憾的是这也不起作用。我还尝试将内容从“upload.js.erb”移动到“_uploadform.js.erb” - 但在日志中,我可以看到,即使我有 data-remote=",它仍然以 HTML 而不是 JS 呈现true”在我的表单的 HTML 中。还有其他想法吗?
  • 我发现,如果我在我的 routes.rb 中设置“defaults: {:format => 'js'}”,我必须从 Forgery 中创建一个例外(protect_from_forgery 除外::upload ”,因为错误:“安全警告:另一个站点上的嵌入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2011-04-03
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多