我有以下模型结构
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"rnContent-Type: image/jpegrn",
@tempfile=#<File:/var/folders/94/slp2488s6nvgg8qq0g0p5c0m0000gn/T/RackMultipart20120323-51480-1lpa754>>,
"description"=>""},...
并且想要访问Asset中的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
但我收到错误消息:
"3"的未定义方法"asset":字符串
我觉得我尝试过每一种变化。如何让它发挥作用?
我猜在这里,但使用值而不是each_with_index怎么样。
params[:item][:assets_attributes].values do |y|
y.asset.session_user_id=12
end
因此,有几件事。
首先,在Hash
上调用的each_with_index
将为您提供对象,然后是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的方法。但这就引出了我们的第二个问题。访问Hash
;您需要使用括号[]
而不是方法调用来完成此操作。
总之,它应该看起来像这样,
params[:item][:assets_attributes].values.each do |y|
y[:session_user_id] = 12
end