Mojowen
Mojowen

Reputation: 457

Rail's strong_parameters not marking Array's Hashes as Permitted

I've got a bit of a puzzler on for strong_parameters.

I'm posting a large array of JSON to get processed and added as relational models to a central model. It looks something like this:

{
   "buncha_data": {
       "foo_data" [
           { "bar": 1, "baz": 3 },
           ...
       ]
   },
   ...
}

And I've got a require/permit flow that looks like it should work:

class TheController < ApplicationController
    def create
        mymodel = MyModel.create import_params
    end

    def import_params
        params.require(:different_property)
        params.require(:buncha_data).permit(foo_data: [:bar, :baz])
        params
    end
end

Yet in the create method when I iterate through this data to create the related model:

self.relatables = posted_data['buncha_data']['foo_data'].map do |raw|
    RelatedModel.new raw
end

I get a ActiveModel::ForbiddenAttributesError. What I've ended up having to do is iterate through the array on my own and call permit on each hash in the array, like so:

params.required(:buncha_data).each do |_, list|
    list.each{ |row| row.permit [:bar, :baz] }
end

What gives?

Upvotes: 0

Views: 135

Answers (1)

Mojowen
Mojowen

Reputation: 457

As MikeJ pointed out - require and permit do not update the object.

I rewrote my controller to be:

def import_params
    params[:different_property] = params.require(:different_property)
    params[:buncha_data] = params.require(:buncha_data).permit(foo_data: [:bar, :baz])
    params
end

And everything worked great. This is somewhat apparent if you read the source code.

Upvotes: 1

Related Questions