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}
所以我在我的 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}