这是对这个问题的跟进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>
答案 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] )
。