RSpec 不会 return 控制器的哈希字段

RSpec doesn't return Hash field to Controller

所以我在我的 Rails API 中运行 #create 测试,但是不知何故工厂中的一个字段是一个 Hash 没有到达 INSERT 的控制器。

工厂

    factory :child do
        id 5
        type "type1"
        vars { var1: 1, var2: 2 }
        values { value1: 1, value2: 2 }
    end

测试

    it "creates child with associated id" do
        Rails::logger.info "Testing CREATE"
        child = FactoryGirl.build(:child).attributes
        Rails::logger.info "INITIAL:"
        Rails::logger.info child
        post :create, :parent => @parent_id, :child => child
        expect(response).to have_http_status(201)
    end

控制器动作

def create
    @parent = Parent.find(params[:parent_id])
    @child = @parent.childs.build(child_params)

    if @child.save
      render json: @child, status: 201
    else
      render json: { error: "404: Not Found" }.to_json, status: 404 #just to know, this error will be changed
    end
end

(...) some code here

def child_params
  params.require(:child).permit(:id, :type, :parent_id) #here I've also tried to include :vars, :value unsuccessfully
end

结果

D, [2015-01-08T20:02:19.016182 #76314] DEBUG -- :   SQL (0.9ms)  
INSERT INTO "childs" ("id", "type", "parent_id", "created_at", "updated_at") 
VALUES (, , , , ) RETURNING "id"  
[["id", 1], ["type", "type1"], ["parent_id", 1], ["created_at", "2015-01-08 20:02:19.010801"], ["updated_at", "2015-01-08 20:02:19.010801"]]

如您所见,Controller 不读取 vars 和 values 哈希值。 RSpec 测试读取它们很好:

I, [2015-01-08T20:02:18.989104 #76314]  INFO -- : 
{"id"=>1, "type"=>"type1", "vars"=>{"var1"=>"1", "var2"=>"2"}, "values"=>{"value1"=>"1", "value2"=>"2"}, "created_at"=>nil, "updated_at"=>nil, "parent_id"=>nil}

我是不是漏掉了什么?

目前 strong_params 不允许(AFAIK,和 according to this)允许内部带有未知键的哈希,所以你需要在你的强参数中做一些事情,如果你知道键

def child_params
  params.require(:sth).permit(:id, :type, :parent_id, vars: [:var1, :var2], values: [:value1, :value2]) 
end

或者干脆做

def child_params
  params.require(:sth).permit!
end

这是我的控制台的直播

[7] pry(#<Admin::SampleController>)> params.require(:sth).permit(:type, vars: [:var1, :var2])
Unpermitted parameters: id, values, created_at, updated_at, parent_id
=> {"type"=>"type1", "vars"=>{"var1"=>"1", "var2"=>"2"}}
[8] pry(#<Admin::SampleController>)> params.require(:sth).permit(:type, vars: [[]])
Unpermitted parameters: var1, var2
Unpermitted parameters: id, values, created_at, updated_at, parent_id
=> {"type"=>"type1", "vars"=>{}}
[9] pry(#<Admin::SampleController>)> params.require(:sth).permit!
=> {"id"=>1,
 "type"=>"type1",
 "vars"=>{"var1"=>"1", "var2"=>"2"},
 "values"=>{"value1"=>"1", "value2"=>"2"},
 "created_at"=>nil,
 "updated_at"=>nil,
 "parent_id"=>nil}