从通过表单上传的文件访问嵌套属性资产上的attr_writer

时间:2012-03-24 00:48:09

标签: ruby-on-rails ruby-on-rails-3 file-upload has-many-polymorphs

我有以下模型结构

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"=>""},...

并希望访问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

但我收到错误消息:

  

未定义的方法`asset'for“3”:String

我觉得我已经尝试了各种变化。如何让这个工作?

2 个答案:

答案 0 :(得分:0)

我在这里猜测但是如何使用值而不是each_with_index。

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

答案 1 :(得分:0)

所以,有几件事情。

首先,呼叫each_with_index的{​​{1}}会为您提供object then the index。自Hash defines each as an enumerable with two variables起,Hash将获得key

value

因此,如果您只想弄乱这些值,那么我建议采用natedavisolds'方法。但这导致我们遇到第二个问题。访问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 ;你需要使用括号Hash而不是方法调用。

总而言之,它应该看起来像这样,

[]