2015-03-19 159 views
0

我在Rails应用程序中使用ajax。在我的应用程序的js我有在Rails 4中不执行Ajax响应

$('#request_name').on('focusout', function() { 
 
     var clientName = $(this).val(); 
 
     $.ajax({ 
 
    \t url: "/requests/autofill/"+clientName, 
 
\t type: "GET", 
 
    \t contentType: 'text/javascript'   
 
    \t });

所以我发送Ajax请求,请求控制器动作自动填充。

自动填充方法:

def autofill 
 
    @client = Client.where("name=?",params[:name]).take 
 
\t respond_to do |format| 
 
    \t format.js 
 
    \t format.html 
 
\t end 
 
end
在我autofill.js.erb文件我有:

alert("hello"); 
 
$('#request_mobile").val('hi there'); \t
(警告只是用于测试) 我想要什么要做的就是在我的autofill.js.erb文件中使用一些值更新#request_mobile id字段。问题是我的autofill.js.erb代码没有被执行。 这里是firebag所示的响应:

alert("hello"); 
 
$('#request_mobile").val('hi there');

但没有任何反应,甚至警报未启动。我不知道我做错了什么?

+0

你能用'ajax'请求显示一些日志文件吗? – 2015-03-19 08:52:10

+0

@Зелёный,开始GET“/ requests/autofill/Jordane%20Koch”:: 1在2015-03-19 14:39:19 +0600 通过RequestsController处理#autofill as */* 参数:{“name” (“Jordane Koch”)限制1 已提交的请求/ autofill.js.erb(0.1ms) 已完成在11ms内200 OK(查看:7.6ms | ActiveRecord:0.4ms)。这是你问的吗? – yerassyl 2015-03-19 08:54:49

回答

1

我不认为我完全明白这里出了什么问题,但我可以看到一些方法来接近理解问题。 首先,我相信用$.get代替$.ajax会更好。设置起来稍微复杂一些。

第二件事 - 你实际上不需要设置中的contentType param,因为它不是关于返回数据的类型,而是你在请求中发送的数据类型。响应数据类型在dataType参数中设置。

第三件事,即使dataType设置为script,我不确定它会被执行,所以最好的方法是手动完成,如果你100%确定你的安全。

最后,这是应该工作的。

$('#request_name').on('focusout', function() { 
    var clientName = $(this).val(); 
    $.get("/requests/autofill/"+clientName, function(data) { 
     eval(data); 
    } 
    );  
+0

如果在firebag的预览中看到我的js代码是否意味着我被执行了。例如,在控制台响应中,请参阅document.getElementById('request_mobile')。value(“test value”);代码并在预览中查看document.getElementByID(测试值)。 – yerassyl 2015-03-19 09:39:48

+0

返回的JavaScript代码默认情况下不会执行(安全第一),因此您得到的只是一串可输出或计算的代码或其他内容。 – Almaron 2015-03-19 10:02:26

+0

是否有执行该代码的方法。我正在那样做,因为这种方法的图腾乐曲。例如在railscast和Rails4敏捷web开发书中。 – yerassyl 2015-03-19 11:29:26

0

问题出在您的客户端。当它收到Ajax响应时,它不会将其作为javascript执行。它正在将它作为文本执行。

加入返回false;后阿贾克斯

$('#request_name').on('focusout', function() { 
    var clientName = $(this).val(); 
    $.ajax({ 
    url: "/requests/autofill/"+clientName, 
    type: "GET", 
    contentType: 'text/javascript'   
    }); 
    return false; 
}); 
+0

它仍然不起作用。我的alert()电话应该启动吗? – yerassyl 2015-03-19 09:30:11