如何为accepts_nested_attributes_for模型分配值

时间:2012-02-23 16:39:46

标签: ruby-on-rails activerecord

这是对这个问题的跟进where's the appropriate place to handle writing the current_user.id to an object我有以下模型。具有__资产的项目。我在项目中using accepts_nested_attributes_for :assets

我想将current_user.id值分配给每个资产。通常我只是@item.update_attributes(params[:item])来保存它。在这种情况下,是否有一种简单的单行方式为每个资产设置user_id?

查看开发日志,我在这里看到了值:

 item[assets_attributes][10][asset]

我应该遍历所有这些并设置user_id值吗?

THX

这里有更多的html(项目 - > menu_item;上面已经省略了简化)。下面提出的控制器sol'n似乎不起作用。我在控制器级别做得很好。任何帮助赞赏。

 <div class='image-row'>
    <input id="menu_item_assets_attributes_18_asset" name="menu_item[assets_attributes][18][asset]" type="file" />
    <input id="menu_item_assets_attributes_18_description" name="menu_item[assets_attributes][18][description]" size="30" type="text" />
    </div>
  <div class='image-row'>
    <input id="menu_item_assets_attributes_19_asset" name="menu_item[assets_attributes][19][asset]" type="file" />
    <input id="menu_item_assets_attributes_19_description" name="menu_item[assets_attributes][19][description]" size="30" type="text" />
   </div>
 <div class='image-row'>
     <a href="/images/371/5ea19b9cfa534f1c1f5457ebb149d4259a662f88_huntbch_original.jpg?1329917713"><img alt="D5cc413a1748fb43b0baa2e32e29b10ac2efda10_huntbch_thumb" src="/images/371/d5cc413a1748fb43b0baa2e32e29b10ac2efda10_huntbch_thumb.jpg?1329917713" /></a>
<div class='img-row-description'>
     <label for="menu_item_assets_attributes_20_description">Description</label>
     <input id="menu_item_assets_attributes_20_description" name="menu_item[assets_attributes][20][description]" size="60" type="text" value="here is my comment" />
     <label for="menu_item_assets_attributes_20_destroy">Destroy</label>
     <input name="menu_item[assets_attributes][20][_destroy]" type="hidden" value="0" /><input id="menu_item_assets_attributes_20__destroy" name="menu_item[assets_attributes][20][_destroy]" type="checkbox" value="1" />
  </div>

2 个答案:

答案 0 :(得分:1)

这个答案可能比你以前的答案有点混乱。

如果每个资产必须有一个项目,那么从资产中完全删除拥有用户的想法可能更为明智:您总是可以通过查询附加项来找到拥有用户,例如@asset.item.user 。但是,如果用户可以独立于项目拥有资产,我认为这不适合您。

如果始终以项目的嵌套方式创建资产,则资产的before_create可以指定所需的值。在asset.rb中这样的东西:

before_create :assign_user

def assign_user
  self.user = self.item.user if self.item && self.item.user
end

最后,如果您只想在控制器中执行此操作,Wolfgang的答案非常好,并且会将user_id添加到每个asset_attributes。

答案 1 :(得分:0)

如何迭代params数组并像这样设置值:

params[:item][:assets_attributes].map! do |asset_params| 
  asset_params[:user_id] = current_user.id 
end

现在您可以像以前一样使用update_attributes( params[:item] )