嵌套属性并与表单哈希交互并将user_id设置为current_user.id

时间:2012-03-24 06:16:39

标签: ruby-on-rails activerecord ruby-on-rails-3.1

我重写了这个问题,因为另一个似乎太冗长了。我有以下模型结构,并且有兴趣上传一组文件(通过构建器一次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="&#x2713;" /><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模型。

2 个答案:

答案 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=设置用户(或者允许用户群进行批量分配)。