1

私は次のモデル構造を持っています

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

しかし、エラーメッセージが表示されます:

「3」の未定義のメソッド`asset':String

すべてのバリエーションを試したような気がします。これを機能させる方法は?

4

2 に答える 2

0

したがって、いくつかのことがあります。

最初に、をeach_with_index呼び出すとHashオブジェクトが表示され、次にindex。が表示されます。は2つの変数を持つ列挙型としてHash定義eachされているため、を取得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のアプローチをお勧めします。しかし、それは私たちの2番目の問題につながります。アクセスHash; []メソッド呼び出しではなく 角かっこを使用して行う必要があります。

全体として、次のようになります。

params[:item][:assets_attributes].values.each do |y|
  y[:session_user_id] = 12
end
于 2012-03-24T04:33:11.777 に答える
0

私はここで推測していますが、each_with_index の代わりに値を使用するのはどうですか。

params[:item][:assets_attributes].values do |y|
  y.asset.session_user_id=12
end
于 2012-03-24T01:16:18.217 に答える