Rails JQuery Ajax 调用成功,但 js.erb 数据不会呈现,除非我包含不需要的字符
Rails JQuery Ajax call succeeds, but js.erb data is not rendered unless I include unwanted characters
我正在尝试设置一个 select 输入,当 select 输入更改时,它将使用 ajax 调用提取的数据填充 div。
我已在日志中验证 ajax 调用成功并且正在呈现 js.erb 文件,但是 js.erb 文件的内容是否实际显示在target div 似乎取决于我是否在 js.erb 文件中包含某些字符。我无法理解为什么会这样,而且我无法在不包含不需要的字符的情况下获得我想要显示的特定数据。
查看:
<div id="gl"></div>
<div class="form-group">
<%= f.label :fc %>
<div class="input-group">
<%= f.collection_select :fc, Location.active, :location_name, :location_name, {prompt: true}, {required: true, class: 'form-control input-sm'} %>
</div>
</div>
查看脚本:
$(document).ready(function() {
$("#idle_asset_fc").change(function() {
$.ajax({
url: "<%= get_gl_prefix_ajax_path %>",
data: "fc=" + $("#idle_asset_fc").val(),
success: function(data){
$("#gl").html(data);
}
});
});
控制器:
def get_gl_prefix_ajax
@result = Location.location_name(params[:fc]).pluck(:gl_prefix)[0]
respond_to do |format|
format.js
end
end
成功改变 div:
的 get_gl_prefix_ajax.js.erb 示例
在我的 erb 标签周围添加双引号或单引号可以将其添加到 div,添加双正斜杠也可以添加数据,但是引号和斜杠也会显示出来,这不需要
'<%= @result %>' <!-- results in '01.1234', including the quotes -->
//<%= @result %> <!-- results in //01.1234, including the forward slashes -->
这是我想要的,但是没有加到div上面的字符:
<%= @result %> <!-- should result in 01.2345 -->
可能还值得一提的是,如果没有引号或正斜杠,也不会添加纯文本。此外,在引号之外或不直接在双正斜杠后面添加任何内容都不会导致任何内容添加到 div.
我曾尝试将我的代码包装在 escape_javascript 中,但它似乎没有什么不同。
代表性日志条目:
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Started GET "/get_gl_prefix_ajax?fc=ILA11" for 1...9 at 2016-12-05 19:16:48 +0000
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Processing by LocationsController#get_gl_prefix_ajax as */*
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Parameters: {"fc"=>"ILA11"}
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [DEBUG] (null):0 (null)(): (null): (12.3ms) SELECT `locations`.`gl_prefix` FROM `locations` WHERE (location_name = 'ILA11')
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Rendered locations/get_gl_prefix_ajax.js.erb (0.4ms)
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Completed 200 OK in 126ms (Views: 2.2ms | ActiveRecord: 12.3ms)
知道发生了什么吗?我怎样才能简单地显示我想要的数据而不显示不需要的字符?
不确定这是否是最干净的购买方式,您可以在 js 字符串上使用 parseFloat()
函数将其从字符串转换为浮点数
在控制器中,当你这样做时:
respond_to do |format|
format.js
end
这意味着您在响应中 returning Javascript,而不是直接 HTML。因此,当您用引号将其括起来或以 //
开头时,它会将其解释为 Javascript 字符串或注释行。
有两种修复方法。
RJS 之道
从您的 JQuery 代码中删除以下 success
块:
success: function(data){
$("#gl").html(data);
}
在get_gl_prefix_ajax.js.erb
文件中添加Javascript,这就是它的意思。它看起来像这样:
$("#gl").html('<%= result %>');
JSON方式
另一种选择是 return 您的数据来自控制器的 JSON 格式,然后在 success
回调 $.ajax
中,解析 JSON 数据并在插入 DOM.
之前将其转换为 HTML
我正在尝试设置一个 select 输入,当 select 输入更改时,它将使用 ajax 调用提取的数据填充 div。
我已在日志中验证 ajax 调用成功并且正在呈现 js.erb 文件,但是 js.erb 文件的内容是否实际显示在target div 似乎取决于我是否在 js.erb 文件中包含某些字符。我无法理解为什么会这样,而且我无法在不包含不需要的字符的情况下获得我想要显示的特定数据。
查看:
<div id="gl"></div>
<div class="form-group">
<%= f.label :fc %>
<div class="input-group">
<%= f.collection_select :fc, Location.active, :location_name, :location_name, {prompt: true}, {required: true, class: 'form-control input-sm'} %>
</div>
</div>
查看脚本:
$(document).ready(function() {
$("#idle_asset_fc").change(function() {
$.ajax({
url: "<%= get_gl_prefix_ajax_path %>",
data: "fc=" + $("#idle_asset_fc").val(),
success: function(data){
$("#gl").html(data);
}
});
});
控制器:
def get_gl_prefix_ajax
@result = Location.location_name(params[:fc]).pluck(:gl_prefix)[0]
respond_to do |format|
format.js
end
end
成功改变 div:
的 get_gl_prefix_ajax.js.erb 示例在我的 erb 标签周围添加双引号或单引号可以将其添加到 div,添加双正斜杠也可以添加数据,但是引号和斜杠也会显示出来,这不需要
'<%= @result %>' <!-- results in '01.1234', including the quotes -->
//<%= @result %> <!-- results in //01.1234, including the forward slashes -->
这是我想要的,但是没有加到div上面的字符:
<%= @result %> <!-- should result in 01.2345 -->
可能还值得一提的是,如果没有引号或正斜杠,也不会添加纯文本。此外,在引号之外或不直接在双正斜杠后面添加任何内容都不会导致任何内容添加到 div.
我曾尝试将我的代码包装在 escape_javascript 中,但它似乎没有什么不同。
代表性日志条目:
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Started GET "/get_gl_prefix_ajax?fc=ILA11" for 1...9 at 2016-12-05 19:16:48 +0000
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Processing by LocationsController#get_gl_prefix_ajax as */*
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Parameters: {"fc"=>"ILA11"}
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [DEBUG] (null):0 (null)(): (null): (12.3ms) SELECT `locations`.`gl_prefix` FROM `locations` WHERE (location_name = 'ILA11')
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Rendered locations/get_gl_prefix_ajax.js.erb (0.4ms)
Mon Dec 05 19:16:48 2016 GMT 26728....com:0 [INFO] (null):0 (null)(): (null): Completed 200 OK in 126ms (Views: 2.2ms | ActiveRecord: 12.3ms)
知道发生了什么吗?我怎样才能简单地显示我想要的数据而不显示不需要的字符?
不确定这是否是最干净的购买方式,您可以在 js 字符串上使用 parseFloat()
函数将其从字符串转换为浮点数
在控制器中,当你这样做时:
respond_to do |format|
format.js
end
这意味着您在响应中 returning Javascript,而不是直接 HTML。因此,当您用引号将其括起来或以 //
开头时,它会将其解释为 Javascript 字符串或注释行。
有两种修复方法。
RJS 之道
从您的 JQuery 代码中删除以下
success
块:success: function(data){ $("#gl").html(data); }
在
get_gl_prefix_ajax.js.erb
文件中添加Javascript,这就是它的意思。它看起来像这样:$("#gl").html('<%= result %>');
JSON方式
另一种选择是 return 您的数据来自控制器的 JSON 格式,然后在
success
回调$.ajax
中,解析 JSON 数据并在插入 DOM. 之前将其转换为 HTML