如果你知道如何让JSON与Rails 3.2一起使用,你能想出来吗?

时间:2012-04-16 20:43:41

标签: jquery ruby-on-rails json

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

我正在查看我的开发日志,我看到该操作运行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哈希值太长的原因。)


设置/ 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 %>

设置/ 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)

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

如果有人能帮我理解我做错了什么,我真的很感激。

2 个答案:

答案 0 :(得分:1)

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

其次,我要看一下您最喜欢的Firebug类似工具(无论是Chrome的开发者工具还是Safari的......等等。看一下&#看看#&#39} 39;从你向服务器发出的AJAX请求回来。(也许它不是你所期望的 - 或者是错误代码,或者你得到的东西与你的不同 - 或者collection_select期待)。

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

答案 1 :(得分:1)

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

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