我有以下 jQuery :
var request = $.get("getPerforceSuites");
request.success(function(result){
alert("res: " + result)
})
request.error(function(jqXHR, textStatus, errorThrown) {
alert ("err: " + errorThrown);
})
routes.rb 中的以下条目:
get "getPerforceSuites", to: "perforce_sync#getPerforce"
并在我的 perforce_sync_controller.rb :
中 def getPerforce
# return getRemoteSuites
puts "++++++++++++++++++++++++++++++++++++++"
puts "Called getPerforce"
puts "++++++++++++++++++++++++++++++++++++++"
return "Hi!"
end
最初这不起作用 - 直到我在/ views / perforce_sync中创建一个空的getPerforce.erb.html文件...现在我可以自信地说,getPerforce操作肯定被调用,因为3&#34 ;看跌期权"行显示在rails服务器日志中。但是,我曾预料到"警告(" res:" +结果)"显示"嗨!" ...相反,我得到了一大堆HTML,看似是一个文档标题(但是从哪个文件,我不知道!):
res: <!DOCTYPE html>
<html>
<head>
<title>Test1</title>
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/authentication.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/bootstrap.css?body=1" media="all" rel="stylesheet" /> ***... SNIP ... ***
任何人都可以解释我在这里遇到的错误吗?我对jQuery有点新鲜 - 但是没有多少谷歌搜索导致我认识到这个问题!
谢谢!
答案 0 :(得分:3)
这是由于rails响应控制器操作的方式。默认情况下,如果您未在控制器操作中调用render
,则它会在您的视图文件夹中查找模板。这就是为什么它要您创建getPerforce.erb.html
文件。
要使它只返回纯文本,在控制器中你可以写:
render :text => 'Hi!'
如果你正在做AJAX的东西,那么通常你会想要返回JSON,你也可以在控制器中这样做
render :json => {:data_key => 'A value'}
答案 1 :(得分:1)
我会建议getPerforce.js.erb
输出<html>
标头的原因是服务器已经使用puts
命令输出内容
<强> HTML 强>
虽然官方术语让我失望,但你必须记住Rails是一个基于HTTP的框架 - 意味着任何输出必须传输到客户端
因此,如果您要输出文本,则必须进行渲染,我猜这是使用Rails HTML渲染引擎完成的
<强>控制器强>
正如Slicedpan
所提到的,我将从控制器中删除任何直接输出(put)。
你应该用这个:
#app/controllers/perforce_sync_controller.rb
def getPerforce
respond_to do |format|
format.html { @return = "Called getPerforce" }
format.js { @return = "hi" }
end
end
#app/views/perforce_sync/getPerforce.js.erb
alert("<%=j @return %>");