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