доступ к attr_writer для вложенного атрибута из файла, загруженного через форму - PullRequest
1 голос
/ 24 марта 2012

У меня есть следующая структура модели

class Asset < ActiveRecord::Base
  attr_writer :session_user_id
  ...
end

class Item < ActiveRecord::Base
  has_many :assets, :as => :assetable, :dependent => :destroy
  ...
end

и я хочу поместить user_id в значение, связанное с активом.У меня проблема с привязкой переменной к загруженному файлу.Вот данные записи:

"assets_attributes"=>{"3"=>{"asset"=>#<ActionDispatch::Http::UploadedFile:0x007fd04dde17f8 @original_filename="nautugly.jpg",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"menu_item[assets_attributes][3][asset]\"; filename=\"nautugly.jpg\"\r\nContent-Type: image/jpeg\r\n",
@tempfile=#<File:/var/folders/94/slp2488s6nvgg8qq0g0p5c0m0000gn/T/RackMultipart20120323-51480-1lpa754>>,
"description"=>""},...

и хотите получить доступ к session_user_id в активе.В элементе items_controller я добавил:

params[:item][:assets_attributes].each_with_index do |value, key|
  value.each do |y|
   y.asset.session_user_id=12
  end

, но получаю сообщение об ошибке:

неопределенный метод "asset" для "3": String

Я чувствую, что перепробовал все варианты.Как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Итак, есть пара вещей.

Сначала each_with_index, вызванный на Hash, даст вам объект , затем index.Поскольку Hash определяет each как перечислимое с двумя переменными , вы получите key value.

params[:item][:assets_attributes].each_with_index do |attr1, attr2|
  puts attr1 # ["3", {"asset" => "MyAsset!"}]
  puts attr2 # 0

  attr1.each do |value|
    puts value 
    # "3" on First Run
    # {"asset" => "MyAsset!"} on Second Run
  end
end

Так что, если вы просто хотите возиться со значениямитогда я предлагаю natedavisolds '1018 * подход.Но это приводит нас к нашей второй проблеме.Доступ к Hash;вам нужно сделать это, используя скобки [], а не вызовы методов.

В целом это должно выглядеть примерно так:

params[:item][:assets_attributes].values.each do |y|
  y[:session_user_id] = 12
end
0 голосов
/ 24 марта 2012

Я предполагаю здесь, но как насчет использования значений вместо each_with_index.

params[:item][:assets_attributes].values do |y|
  y.asset.session_user_id=12
end
...