【问题标题】:respond_to :json behaving very oddlyrespond_to :json 表现得很奇怪
【发布时间】:2014-12-12 01:51:03
【问题描述】:

我有一个控制器:

class ThingController < ActionController
  respond_to :json

  def create
    puts "CREATE " + params.inspect
  end
end

还有一个测试:

require "spec_helper"

describe "/thing" do
  context "create" do
    it "should get params" do
      params = {"a" => "b", "c" => ["d"], "e" => [], "f"=>"",
                "g"=>nil, , "controller" => "NOPE", "action" => "NOPE"}
      post uri, params
    end
  end 
end

当我运行它时,会记录以下内容:

CREATE {"a"=>"b", "c"=>["d"], "action"=>"create", "controller"=>"thing"}

我的问题是:

  • e 去哪儿了?我希望它反序列化为一个空数组,而不是什么都没有。
  • 为什么actioncontroller 参数混在其中? body 和 rails 内部不是完全独立的关注点吗?
  • 因此,我的actioncontroller JSON 字段被覆盖。我将如何访问这些?
  • 因此这不是接受 JSON 的正确方式吗?

我是 Rails 的新手,但我做过很多 Django。

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

    rails 中间件将添加操作和控制器参数,因此如果您仍想访问自定义值,则必须将它们放入嵌套哈希中。

    尝试将format: 'json' 添加到测试中的参数中。这将发送不同的内容类型标头,并可能有助于正确序列化参数以保留 e 参数。

    【讨论】:

      【解决方案2】:

      这个问题有两个部分:您需要确保您的参数以 JSON 格式发送,并且它们被解释为 JSON。

      基本上,你必须

      • 将您的参数编码为 JSON
      • 设置适当的内容类型并接受标题

      路见POSTing raw JSON data with Rails 3.2.11 and RSpec

      【讨论】:

      • 太好了,谢谢。我正在遵循一个必须稍微损坏的示例。
      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多