【问题标题】:If you know how to get JSON working with Rails 3.2, can you figure this out?如果你知道如何让 JSON 与 Rails 3.2 一起工作,你能弄清楚吗?
【发布时间】:2012-04-16 20:43:40
【问题描述】:

我正在尝试构建一个动态菜单,因此当用户选择一个国家/地区时,状态菜单会更新。

我正在查看我的开发日志,我看到该操作运行 db 查询,然后呈现 json.erb 文件,但我无法从浏览器获得任何响应。

这是我所拥有的:

控制器/settings_controller.rb

respond_to :html, :json

  def getstates
    @states = Country.find_by_iso(params[:account][:addresses_attributes]["0"][:country]).states
    respond_with(@states)
  end

(注意:表单是嵌套表单,这就是为什么 params 哈希这么长。)


settings/edit.html.erb

<%= address.collection_select :country, Country.order(:name), :iso, :name, {:include_blank => true}, "data-remote" => true, "data-url" => "/settings/getstates", "data-type" => :json  %>

<%= address.select :state, [], {:include_blank => true}, :disable => true %>

settings/getstates.json.erb

$(document).ready(function() {

    $("#account_addresses_attributes_0_country").bind('ajax:success', function(evt, data, status, xhr){
      var select = $('#account_addresses_attributes_0_state');

      if (data !== null) {
        select.removeAttr('disabled');
        $.each(data, function(key, value) {
          $("<option/>").val(value[1]).text(value[0]).appendTo(select);
        });
      } else {
        select.empty();
        select.attr('disabled', 'disabled');
      }
    });
});

(注意:我从http://blog.madebydna.com/all/code/2011/12/05/ajax-in-rails-3.html得到这个代码)


开发日志

Processing by SettingsController#getstates as JSON
  Parameters: {"account"=>{"addresses_attributes"=>{"0"=>{"country"=>"UY"}}}}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
  Country Load (0.2ms)  SELECT "countries".* FROM "countries" WHERE "countries"."iso" = 'UY' LIMIT 1
  Rendered settings/getstates.json.erb (0.3ms)
Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.3ms)

这是我在开发日志中看到的输出。但在浏览器中什么都没有。我尝试添加警报和控制台日志方法,但没有。

如果有人能帮助我理解我做错了什么,我将不胜感激。

【问题讨论】:

    标签: jquery ruby-on-rails json


    【解决方案1】:

    如果您使用 Firebug 的控制台选项卡,您将看到发出 ajax 请求。然后您可以打开它并查看响应正文。就像 Ryan 建议您请求 JSON 但返回完整的 javascript 一样。因此,如果您要保持这种方式,则必须在回调函数中评估响应,即 eval(data) 或 jQuery 也有一个快捷方式,您可以在其中请求“脚本”类型;但是现在 RJS 已经从 Rails 中删除了,这有点令人不悦。相反,按照 Dan 的建议,将 settings/getstates.json.erb 的内容移动到您的编辑视图中,然后删除 getstates.json.erb 文件。为了帮助您完成这项工作,现在让请求/响应更简单。只需执行此操作并在 Firebug 中检查它以查看发生了什么。之后,将其连接起来以将响应内容转换为您想要的选项标签。

    $.get("/settings/getstates", function(data){
      console.log(data);
    }, 'json')
    

    【讨论】:

    • 甜,成功了!我必须修改 URL 以包含控制器操作查找状态所需的参数,但它向控制台返回了一组 JSON 对象!下一个问题......我现在如何访问它们?至少,我希望在视图中看到它们只是作为检查,但理想情况下,我想将它们插入到我的地址字段中的状态选择器中。
    • 仅供参考,经过一番修改,我想出了如何获取 json 并让 JS 做我需要的事情。再次感谢您的帮助!
    【解决方案2】:

    首先,我对您的 .json.erb 视图有点困惑。当 REST 请求请求 JSON 时,您似乎正在返回 Javascript(在浏览器中执行)。

    其次,我会看看你最喜欢的 Firebug 类似工具(无论是 Chrome 的开发者工具还是 Safari 的......随便。看看你向服务器发出的 AJAX 请求返回了什么. (也许这不是你所期望的——要么是错误代码,要么你得到的东西与你所期望的不同——或者collection_select 所期望的)。

    我的猜测是您的 .json 视图正在吐回实际的 Javascript,然后(某些东西)试图解析为 JSON,失败并在某处给出 Javascript 错误消息(中止 Javascript)。同样,追踪其中一个的最简单方法是使用类似 Firebug。

    【讨论】:

    • 这就是问题所在,我在浏览器控制台中看不到任何内容。如果我执行标准 js 请求,我可以看到浏览器响应,但没有反馈、错误和日志。另外,请原谅我,您的意思是:irst, I'm a little confused about your .json.erb view. It looks like you're returning Javascript (to execute in the browser) when the REST request is asking for JSON.
    • 内森,JSON 不是 Javascript。将 getstates.json.erb 的内容放入 javascript 文件中,然后将其删除。 respond_with(@states) 会将@states 数组呈现为 JSON。
    • 也就是说,将getstates.json.erb重命名为getstate.js.erb?我已经尝试过了,但是我没有看到渲染文件的服务器日志。
    • 有没有一种好方法可以在回复期间捕获控制器返回的内容,以便我可以看到集合?我一直在黑暗中工作。
    • 我认为 Firebug 的 Net 选项卡会执行此操作 - 包括 Ajax 请求在内的任何请求都会显示出来,包括响应的正文。我知道 Chrome 的 Web 开发工具可以做到这一点(我的大部分开发工作都是在 Chrome 中完成的——它有这种行为——因此存在不确定性)。
    猜你喜欢
    • 2012-01-16
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2021-01-06
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多