1

uplaoded上嵌套asstribute資產爲attr_writer我有以下模型結構訪問從文件經由形式

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文件。這裏是post'd數據:

"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 

但我收到錯誤消息:

undefined method `asset' for "3":String 

我覺得我已經想盡變化。任何想法如何讓這個工作?

THX

回答

0

我猜在這裏,但怎麼樣使用,而不是each_with_index值。

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

嗯...這似乎並不奏效。我只是想獲得與資產相關的user_id。不應該是這個硬的 – timpone 2012-03-24 03:50:58

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答案,這是有道理的,但它只是不工作:-(我用回形針。也許嘗試沒有資產? – timpone 2012-03-24 04:49:43

+0

我重新讀你的問題,我認爲'資產'是一個嵌入現在我意識到它實際上是'Asset'的一個屬性,所以你只需從[Hash]索引中去除[:asset]即可。 – Azolo 2012-03-24 06:11:07