1

У меня есть следующая структура моделидоступа к attr_writer на вложенную asstribute актив из файла uplaoded через форму

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

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

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

"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 в Asset. В items_controller, я добавил:

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

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

undefined method `asset' for "3":String 

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

ТНХ

ответ

0

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

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

хмм ... это, кажется, не работает. Я просто пытаюсь получить user_id asssociated с активом. Не должно быть этого жесткого – timpone

0

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

Во-первых, each_with_index, вызванный на Hash, предоставит вам object then the index. С Hash defines each as an enumerable with two variables вы получите keyvalue.

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' подход. Но это приводит нас к нашей второй проблеме. Доступ к Hash; вам нужно сделать это, используя скобки [], а не вызовы методов.

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

params[:item][:assets_attributes].values.each do |y| 
    y[:session_user_id] = 12 
end 
+0

thx для ответа, это имеет смысл, но это просто не работает :-(Я использую paperclip. Может быть, попробуйте без актива? – timpone

+0

Я перечитываю ваш вопрос, я думал, что «актив» был встроенным Теперь я понимаю, что это на самом деле атрибут «Asset». Таким образом, вы просто отключите [: asset] от индекса «Hash». – Azolo