params.permit(:object_ids)
としたとき、
:object_ids => [BSON::ObjectId('573d8ac76200b0176c000001')]
はダメ- 空の Array
[]
が返る
- 空の Array
:object_ids => ["573d8ac76200b0176c000001"]
なら ok
BSON::ObjectId のリストをフォーム入力などから受け取って BSON::ObjectId 型にキャストして処理するプログラムを書く場合は、コントローラーのレイヤでキャストせず、文字列表現で受け取ってモデルなど下層でキャストする。
def user_params params.require(:user).permit({ reference_ids: [] }) end def user_params2 _params = params.require(:user) _params[:reference_ids] = _params[:reference_ids].map { |id| BSON::ObjectId(id) } _params.permit(reference_ids: []) end
test "should create user" do id = BSON::ObjectId.new post :create, user: { reference_ids: [id] } data = JSON.parse(response.body) pp data assert_equal data['user_params']['reference_ids'], [id.to_s] end test "should create user (2)" do id = BSON::ObjectId.new post :create, user: { reference_ids: [id] } data = JSON.parse(response.body) pp data assert_equal data['user_params2']['reference_ids'], [id.to_s] end
# Running: {"params"=> {"user"=>{"reference_ids"=>[{"$oid"=>"573d8b776200b017d6000001"}]}, "controller"=>"users", "action"=>"create"}, "user_params"=>{"reference_ids"=>["573d8b776200b017d6000001"]}, "user_params2"=>{}} F......{"params"=> {"user"=>{"reference_ids"=>[{"$oid"=>"573d8b776200b017d6000002"}]}, "controller"=>"users", "action"=>"create"}, "user_params"=>{"reference_ids"=>["573d8b776200b017d6000002"]}, "user_params2"=>{}} . Finished in 0.062714s, 127.5633 runs/s, 31.8908 assertions/s. 1) Failure: UsersControllerTest#test_should_create_user_(2) [/Users/kyanny/playground/strong_parameters_reject_array_of_bson_objectid/test/controllers/users_controller_test.rb:26]: Expected: nil Actual: ["573d8b776200b017d6000001"] 8 runs, 2 assertions, 1 failures, 0 errors, 0 skips