Rails js.erb 文件未执行

Posted

技术标签:

【中文标题】Rails js.erb 文件未执行【英文标题】:Rails js.erb file not being executed 【发布时间】:2012-07-19 02:37:31 【问题描述】:

我只是想让我的 index.js.erb 文件执行 alert("hi") 命令,但它不起作用。我对rails很陌生,我想知道你们是否可以帮助我!看起来 servers_controller.rb 索引方法没有正确执行 format.js。有什么建议/想法吗?

servers_controller.rb

def index
    @servers = Server.all

    update_all_servers #calls the method update_all_servers in application_controller.rb

    respond_to do |format|
      format.html # index.html.erb
      format.json  render json: @servers 
      format.js #index.js.erb
    end
end

index.js.erb

alert("hi");
$("#comments").fadeOut();

index.html

<%- model_class = Server.new.class -%>
<div class="page-header">
  <h1><%=t '.title', :default => model_class.model_name.human.pluralize %></h1>
</div>
<table class="table table-striped">
  <thead>
    <tr>
 <!--     <th><%= model_class.human_attribute_name(:id) %></th> -->
      <th><%= model_class.human_attribute_name(:hostname) %></th>
      <th><%= model_class.human_attribute_name(:port) %></th>
  <!--    <th><%= model_class.human_attribute_name(:username) %></th>
      <th><%= model_class.human_attribute_name(:password) %></th>
      <th><%= model_class.human_attribute_name(:ssh_username) %></th>
      <th><%= model_class.human_attribute_name(:ssh_password) %></th> 
      <th><%= model_class.human_attribute_name(:source_branch) %></th> -->
      <th><%= model_class.human_attribute_name(:source_revision) %></th>
      <th><%= model_class.human_attribute_name(:release) %></th>
      <th><%= model_class.human_attribute_name(:rhel_version) %></th>
      <th><%= model_class.human_attribute_name(:gpu_type) %></th>
      <th><%= model_class.human_attribute_name(:total_users) %></th>
      <th><%= model_class.human_attribute_name(:current_users) %></th>
      <th><%= model_class.human_attribute_name(:created_at) %></th>
      <th><%=t '.actions', :default => t("helpers.actions") %></th>
    </tr>
  </thead>
  <tbody>
    <% @servers.each do |server| %>
      <tr>
  <!--      <td><%= link_to server.id, server_path(server) %></td> -->
        <td><%= server.hostname %></td>
        <td><%= server.port %></td>
   <!--     <td><%= server.username %></td>
        <td><%= server.password %></td>
        <td><%= server.ssh_username %></td>
        <td><%= server.ssh_password %></td>
        <td><%= server.source_branch %></td> -->
        <td><%= server.source_revision %></td>
        <td><%= server.release %></td>
        <td id="comments"><%= server.rhel_version %></td>
        <td><%= server.gpu_type %></td>
        <td><%= server.total_users %></td>
        <td><%= server.current_users %></td>
        <td><%=l server.created_at %></td>
        <td>
          <%= link_to t('.edit', :default => t("helpers.links.edit")),
                      edit_server_path(server), :class => 'btn btn-mini' %>
          <%= link_to t('.destroy', :default => t("helpers.links.destroy")),
                      server_path(server),
                      :method => :delete,
                      :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')),
                      :class => 'btn btn-mini btn-danger' %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>

<%= link_to t('.new', :default => t("helpers.links.new")),
            new_server_path,
            :class => 'btn btn-primary' %>

application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any javascript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require_tree .

【问题讨论】:

如果删除第二行,javascript 会运行吗?尝试自己运行警报。 删除第二行仍然不起作用:( 您确定 index 操作甚至被调用了吗? 这就是我的想法,format.js 没有调用 index.js.erb 但我不确定如何解决这个问题。 将调用移至控制器中 format.html 上方的 format.js 【参考方案1】:

将浏览器指向/servers.js,它会显示js,但不会运行,因为它不在脚本标签中。

respond_to 部分选择一种且只有一种媒体类型来响应,因此当您查看 html 页面时,如果您想要包含一些 javascript,它需要以某种方式位于 html 页面中的脚本标记中。 index.js.erb 格式适用于仅用于 javascript 输出的请求,例如 ajax 请求。

【讨论】:

谢谢,我试试看! 那么有一个用于 def 方法的 method.js 文件还可以在 rails 4 中包含 ruby​​ 代码 吗?在您需要在扩展中添加 .erb 之前【参考方案2】:

我知道这个问题很老,虽然这是解决方案,因为我今天两次偶然发现这个问题,甚至不记得;)

根据this 博客文章,您应该检查您的request type。它必须是JS。如果您通过AJAX 请求该控制器操作,只需省略dataType-attribute。这会将请求类型设置为*/*,但它仍然可以工作。

示例:

$.ajax(
    url: '/users/auth/facebook/callback',
    type: 'GET'
);

编辑

对控制器的请求应如下所示:

Processing by Users::OmniauthCallbacksController#facebook as JS

使用我的解决方案,它将如下所示:

Processing by Users::OmniauthCallbacksController#facebook as */*

将 dataType 设置为“JS”对我不起作用,但它仍然可以像 JS 一样工作。

【讨论】:

以上是关于Rails js.erb 文件未执行的主要内容,如果未能解决你的问题,请参考以下文章

js.erb 文件正在执行两次。 Ruby on Rails - private_pub

Rails - 如何确保已在 js.erb 中呈现部分内容

Rails 5 UJS:如何指定单个js文件以供执行

Bootstrap Modal 未关闭数据关闭(Rails)

Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板

在rails中使用js.erb