我重写了这个问题,因为另一个似乎太冗长了。我有以下模型结构,并且有兴趣上传一组文件(通过构建器一次2个)。我不确定是否有多态关系
class Item < ActiveRecord::Base
has_many :assets, :as => :assetable, :dependent => :destroy
accepts_nested_attributes_for :assets, :allow_destroy => true, :reject_if => lambda { |a| a[:asset].blank? }
attr_accessible :assets_attributes, :asset
...
end
class Asset < ActiveRecord::Base
belongs_to :assetable, :polymorphic => true
attr_accessible :name, :user_id, :description ...
...
end
我已经复制了整个表格:
<form accept-charset="UTF-8" action="/arc/items/70" class="edit_item" enctype="multipart/form-data" id="edit_item_70" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="NnaCxwmfy2zT8MnN7oNQnOx0xYXkgKUs+NbIh8+8cL4=" /></div>
<div class='files'>
<input id="item_assets_attributes_70_asset" name="item[assets_attributes][70][asset]" type="file" />
<input id="item_assets_attributes_70_description" name="item[assets_attributes][70][description]" size="30" type="text" />
<input id="item_assets_attributes_71_asset" name="item[assets_attributes][71][asset]" type="file" />
<input id="item_assets_attributes_71_description" name="item[assets_attributes][71][description]" size="30" type="text" />
</div>
<input name="commit" type="submit" value="Update Menu item" />
</form>
以下是与之交互的控制器:
class ItemsController < ApplicationController
...
def update
item=params[:item]
item[:assets_attributes].values do |v|
v[:asset][:user_id]=3 # just hard-code it to see if workig
end
if @item.update_attributes(item)
flash[:notice]="Menu Item has been updated #{undo_link}"
else
flash[:notice]="Menu Item has not been updated"
end
end
在我的资产类中,user_id永远不会被设置。我怎么做这个工作?我显然想要获得current_user.id。
THX
编辑#1
使用Rails 3.1
编辑2
我注意到的一件事是,如果我在循环中设置一个实例变量然后将其调试到视图中,那么就没有设置意味着这个循环甚至没有运行。
item[:assets_attributes].values do |v|
v[:user_id]=3
@a="here is a string"
end
我还使用项目类的相应attr_accessible更新了Item模型。
答案 0 :(得分:1)
在这个区块中,你没有做任何事情。
item[:assets_attributes].values do |v|
v[:user_id]=3 # just hard-code it to see if working
end
values
只返回值,因此如果要与这些值进行交互,则需要有each
之类的迭代器。试试这个
item[:assets_attributes].values.each do |v|
v[:user_id]=3 # just hard-code it to see if working
end
答案 1 :(得分:0)
您似乎无法批量分配user_id。之一:
您定义了attr_accessible,但它不包含user_id 您已定义了attr_protected,它确实包含user_id 您正在使用Rails 3.2,它会自动执行此操作以防止通过批量分配(这是一个安全漏洞)将对象重新分配给其他用户。
如果是这种情况,那么最好的办法是直接通过asset.user=
设置用户(或者允许用户群进行批量分配)。