2

我使用 Backbone 作为我的新项目的 Javascript 框架。但是,当我在 Model 上调用 save() 时,Rails 服务器无法将其解析为 params 哈希

Javascript

user new Project.Models.User({email : "nqtien310@gmail.com"})
user.save()

导轨服务器

puts params
=> {"action"=>"create", "controller"=>"users"}

puts request.raw_post
=> "{\"email\":\"nqtien310@gmail.com\"}"

然后我尝试将 Backbone.emulateJSON 设置为 true

Javascript

Backbone.emulateJSON = true

Rails 现在可以将 post 数据解析为 params,但不能解析预期的数据

puts params
=> {"model"=>"{\"email\":\"nqtien310@gmail.com\"}", "action"=>"create", "controller"=>"users"}
4

1 回答 1

1

好吧,经过长时间的研究,我发现在我的个人资料的 initialize/mime_types.rb 里面,他们补充说

Mime::Type.register "application/json", :mobile

深入一点,可以看到 Rails 使用 mime 类型来解析请求体,在这种情况下,application/json 被覆盖,Rails 无法使用 Json 解析策略将请求体解析为 params 哈希,即为什么它是空的

Backbone.emulateJSOn 会设置另一个 content-type 而不是 application/json,这就是为什么 Rails 仍然可以理解这个 Mime Type,并且有相应的解析策略,但是由于它不是 JSON 策略,所以参数不是 JSON 格式

Json 解析策略(来自 Rails 源码)

when :json
      data = request.deep_munge ActiveSupport::JSON.decode(request.body)
      request.body.rewind if request.body.respond_to?(:rewind)
      data = {:_json => data} unless data.is_a?(Hash)
      data.with_indifferent_access
于 2013-06-30T03:31:33.660 回答