Параметры содержат массив, который хочет быть хешем - PullRequest
0 голосов
/ 24 июня 2011

У меня есть массив (из file_field, :multiple => true) в моем params, который я хочу превратить в хеш, чтобы я мог создавать связанные модели для каждого элемента и процесса в моем действии создания.

В настоящее время получает:

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

Я бы хотел превратить это во что-то вроде:

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

считал что-то вроде этого, но это явно неправильно:

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

Что такое "путь рельса"?

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

Я сделал нечто подобное при получении данных с устройства iOS.Но если я понимаю, что вы хотите и как выглядят ваши модели, чтобы заставить работать вложенные атрибуты, вы не хотите, чтобы это выглядело так:

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

Вы хотите, чтобы это выглядело так:

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

И чтобы сделать это, все, что вам нужно сделать, это:

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

Теперь, если я неправильно понял, что вам нужно, чтобы получить то, что вы просили за то, что выможет работать (я не пользуюсь reduce aka inject), или вы можете использовать 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

Не намного лучше IMO.

0 голосов
/ 24 июня 2011

Вам необходимо возвращать хеш результата в конце каждой итерации.

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