【问题标题】:Call controller method and get data back on client调用控制器方法并在客户端取回数据
【发布时间】:2025-12-02 23:55:02
【问题描述】:

我想调用一个返回字符串的服务器端控制器方法,该字符串最终将是 JSON,然后一旦我将数据返回到客户端,我就可以将其注入视图的一部分供用户查看。

这是我目前的设置:

控制器:

class HomeController < ApplicationController

  def index
  end

  def show
  end

  def name
    name = "Sean"
    respond_to do |format|
      format.html
      format.json {render json: name }
    end
  end
end

路线:

  resources :home do 
    collection do
      get 'name'
    end
  end

AJAX 调用:

window.callAPI = () ->
  $.ajax
    type: "GET"
    url: "/home/name"
    success: (data) ->
      console.log data
    error: (error) ->
      console.log error

我收到以下错误:

Started GET "/home/name" for 127.0.0.1 at 2015-01-22 13:28:59 -0700
Processing by HomeController#name as */*
Completed 500 Internal Server Error in 9ms

ActionView::MissingTemplate (Missing template home/name, application/name with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :coffee, :jbuilder]}. Searched in:
  * "/home/sylanz/Documents/NimbusCC/app/views"
):
  app/controllers/home_controller.rb:10:in `name'

【问题讨论】:

    标签: javascript ruby-on-rails ruby ajax json


    【解决方案1】:

    您应该调用/home/name.json - 如错误所示,否则 Rails 不知道您需要 JSON 响应,并选择 HTML 作为默认响应。而且您没有 HTML 模板。

    事实上,如果此操作是纯粹的 API 端点,则完全省略 format.html 子句。

    【讨论】:

      【解决方案2】:

      您的 Ajax 调用应该是(注意包含 dataType 选项):

      $.ajax
        type: "GET"
        url: "/home/name"
        dataType: "json" #Added
        success: (data) ->
          console.log data
      

      【讨论】:

      • 这消除了正在发生的错误。但是,我的console.log(data) 没有开火。编辑:我刚刚添加了一个错误回调,并得到了我所期望的。状态码是 200,这应该意味着一切都按计划进行,那么为什么它在错误回调中返回而不是成功?
      • @SeanCallahan 响应可能是无效的 JSON。
      • 是的,您的字符串不会呈现为 json。试试name = {"name": "Sean"}
      【解决方案3】:

      在 jQuery 中有一个 getJSON 快捷方式可用。在这种情况下,它是 ajax 的直接替换,您的请求中缺少的部分,正如其他人所记录的那样:dataType: "json"

      你怎么知道的?在您的日志中注意:

      :formats=>[:html]
      

      【讨论】: