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

时间:2014-03-27 09:34:19

标签: javascript jquery ruby-on-rails ruby

我有以下 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有点新鲜 - 但是没有多少谷歌搜索导致我认识到这个问题!

谢谢!

2 个答案:

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