2012-03-24 35 views
0

我已經重寫了這個問題,因爲另一個看起來太冗長了。我有以下模型結構,並且有興趣上傳一組文件(通過構建器每次2個)。我不知道,如果多態RELAT嵌套屬性並與窗體哈希交互並將user_id設置爲current_user.id

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。

回答

0

您似乎無法批量分配user_id。或者:

您已attr_accessible限定,並且它不包括user_id說明 您已attr_protected限定,並且它不包括user_id說明 您正在使用的Rails 3.2,它可以自動這樣做是爲了防止重新分配一個目的是通過質量不同的用戶分配(這是一個安全漏洞)。

如果是這樣,那麼最好的辦法是直接通過asset.user=來設置用戶(或者允許user_id被批量分配,我想)。

+0

thx Shaun,我有attr_accessible(更新上面)的user_id和我使用的Rails 3.1 - 我敢肯定有一個語法問題迭代資產。也許分配asset.user是有道理的,然後在default_values before_save中賦值'self.user_id = self.user.id'? – timpone 2012-03-24 15:00:14

+0

分配asset.user與將asset.user_id設置爲該用戶的ID相同。你不需要顯式設置user_id - Rails會處理它。 – Shaun 2012-03-25 19:36:48

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