开发者

Params contain an array that wants to be a hash

开发者 https://www.devze.com 2023-03-14 20:48 出处:网络
I have an array (coming from a file_field, :multiple => true) in my params that I want to turn into a hash so I can build associated models for each element and process in my create action.

I have an array (coming from a file_field, :multiple => true) in my params that I want to turn into a hash so I can build associated models for each element and process in my create action.

Currently receiving:

{"gallery"=>{"name"=>"A Gallery", "photos_attributes"=>{"0"=>{"image"=>[#<1st Image data removed for brevity>, #<2nd Image data removed for brevity>]}}}, "commit"=>"Save"}

I'd like to turn it into something like:

{"gallery"=>{"name"=>"A Gallery", "photos_attributes"=>{"0"=>{"image"=>#<1st Image data removed for brevity>}, "1"=>{"image"=>#<1st Image data removed for brevity>}}}, "commit"=>"Save"}

considered something like this but it's clearly 开发者_如何转开发wrong:

i = 0
params[:gallery][:photos_attributes]["0"][:image].reduce({}) do |result, element|
  result[i++.to_s] = element
end

What's the "Rail's Way"?


You need to return the result hash at the end of each iteration.

i = 0
params[:gallery][:photos_attributes]["0"][:image].reduce({}) do |result, element|
  result[(i += 1).to_s] = element
  result
end


I've done something similar when receiving data from an iOS device. But, if I understand what you want and what your model(s) look like, to get nested attributes to work you don't want it to look like:

{ "photos_attributes" => { "0" => <image1>, "1" => <image2>, ... }

You want it to look like:

{ "photos_attributes" => [ <image1>, <image2>, ... ] }

And to do that all you need to do is:

params["gallery"]["photos_attributes"] = params["gallery"]["photos_attributes"]["0"]["image"]

Now, if I've misunderstood what you need, to get what you've asked for what you have might work (I don't use much reduce aka inject) or you could use tap:

i = 0
params["gallery"]["photos_attributes"] = {}.tap do |hash|
  params["gallery"]["photos_attributes"]["0"]["image"].each do |image|
    hash[i.to_s] = image
    i = i + 1
  end
end

Not a whole lot better IMO.

0

精彩评论

暂无评论...
验证码 换一张
取 消