javascript - 将变量传递给 escape_javascript

标签 javascript ruby-on-rails

这将传递字符串 productID 而不是变量 which == 5。如何传递变量而不是字符串?

<script>
$(document).ready(function(){
    $(".test").click(function(){
      var productID = 5;
      $("#productModal").html("<%= escape_javascript(render 'layouts/modal', :product_id => "productID").html_safe %>"); 
      $("#modal").modal();
    });
});
</script>

也尝试过:

$("#productModal").html("<%= escape_javascript(render 'layouts/modal', :product_id => " + productID + ").html_safe %>");

这也只是输出 + productID + 而不是 5

最佳答案

如果您想修复您提供的代码,最好执行以下操作:

<script>
$(document).ready(function(){
    $(".test").click(function(){
      var productID = 5;
      $("#productModal").html("<%=j render('layouts/modal', product_id: " + productID + ").html_safe %>"); 
      $("#modal").modal();
    });
});
</script>

但是这段代码有几个大问题。


不显眼

首先,您为什么使用 <script>标签?

这表明您已将其放入 View 中,这是非常糟糕的做法。

最有效的方法是使用 unobtrusive javascript模式,这就是 Rails asset pipeline能够支持:

#app/assets/javascripts/application.js
$(document).on("click", ".test", function(e) {
    var productID = 5;
    $("#productModal").html(productID); 
    $("#modal").modal();
});

这不仅意味着您可以在整个您的应用程序中使用此代码(模块化),还可以确保您能够调用正确的

--

辅助功能

其次,您会注意到我已经排除了 escape_javascript上面的代码。

这是因为 Assets 管道不处理ERB/Rails代码

Javascript 是客户端; Rails 是服务器端的。

这很重要,因为当您调用 render 时等等 - 你的 javascript 将无法执行此操作,除非它是从服务器调用的,特别是如果部分需要在 DOM 加载时设置的变量。

为此,您需要使用 ajax :

#config/routes.rb
get "modal", to: "application#modal"

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   def modal
      @productID = params[:product_id]
      respond_to do |format|
         format.js { render "layouts/modal", product_id: @productID }
      end
   end
end

#app/assets/javascript/application.js
$(document).on("click", ".test", function(e) {
   var productID = 5;
   $.get("modal", {product_id: productID}, function(data) { 
      $("#productModal").html(data); 
      $("#modal").modal();
   });
});

这里有一个小警告,如果您附加 .erb到 JS 文件( javascripts/application.js.erb ),您将能够使用 render .但是,这只能在调用文件时发生;因此将任何变量传递给部分将不起作用。


更新

这是最终起作用的:

#app/assets/javascripts/application.js
$(document).on("click", ".testinggg", function(e) { 
   var productID = 5; 
   $.get("modal", {product_id: productID}, function(data){ 
     $("#productModal").html(data); 
     $("#modal").modal(); 
   }, "html"); 
});

关于javascript - 将变量传递给 escape_javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197224/

相关文章:

javascript - Selenium:使用 C# 在 IWebElement 上触发鼠标滚轮

javascript - highchart 将 x 轴标签放置在日期时间轴上的刻度之间

ruby-on-rails - 两次引用模型编写迁移

ruby-on-rails - 神秘的 Mongrel Rails 崩溃

mysql - 增加 rails 中具有固定值的所有记录

javascript - 使用 jquery 将文本包裹到 <b> 中并由 <br> 分隔

javascript - 对象未定义时的最佳实践 if - else

php - jQuery 转义空格

ruby-on-rails - rails 4 在 postgres 的多个列上选择不同的位置和限制

ruby-on-rails - 是否可以让 Rails 中的 View 助手生成 Haml 缩进 HTML?