jQuery对控制器动作的调用并不像预期的那样

我有以下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“put”行出现在rails中服务器日志。 但是,我原本期望“alert(”res:“+ result)”显示“嗨!”……但是,我得到了一大堆HTML,看似是一个文档标题(但是从哪个文件,我我不知道!):

 res:    Test1    ***... SNIP ... *** 

任何人都可以解释我在这里错了吗? 我对jQuery有点新意 – 但谷歌没有多少谷歌认识到这个问题!

谢谢!

这是由于rails响应控制器操作的方式。 默认情况下,如果您未在控制器操作中调用render ,则它将在您的views文件夹中查找模板。 这就是为什么它要你创建一个getPerforce.erb.html文件。

要使它只返回纯文本,在控制器中你可以写:

 render :text => 'Hi!' 

如果你正在做AJAX的东西,那么通常你会想要返回JSON,你也可以在控制器中这样做

 render :json => {:data_key => 'A value'} 

我会建议getPerforce.js.erb输出标头的原因是因为服务器已经使用puts命令输出内容


HTML

虽然官方术语让我失望,但你必须记住Rails是一个基于HTTP的框架 – 意味着任何输出都必须传输给客户端

因此,如果您正在输出文本,则必须进行渲染,我猜这是使用Rails HTML渲染引擎完成的


调节器

正如Slicedpan所提到的,我将摆脱控制器的任何直接输出( Slicedpan )。

你应该用这个:

 #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 %>");