2012-08-24 60 views
0

當我嘗試提交一個簡單的嵌套形式的Rails給我一個錯誤:Rails的上傳與嵌套形式

NoMethodError in UserController#update 
undefined method `[]' for #<ActionDispatch::Http::UploadedFile:0x3f4e318> 

,而params是:

{ 
"utf8"=>"✓", 
"authenticity_token"=>"HFWawKp4RH7+AFV0yQ1cXpzxHDfubKTKkiDiS6QKnJk=", 
"user"=> { 
    "name"=>"Alex", 
    "pics_attributes"=> { 
    "pic"=>#<ActionDispatch::Http::UploadedFile:0x3f4e318 
    @original_filename="Beautiful Sky_thumb.jpg", 
    @content_type="image/jpeg", 
    @headers="Content-Disposition: form-data; name=\"user[pics_attributes][pic]\"; filename=\"Beautiful Sky_thumb.jpg\"\r\nContent-Type: image/jpeg\r\n", 
    @tempfile=#<File:C:/Users/Alex/AppData/Local/Temp/RackMultipart20120824-4784-5rmxid>> 
    } 
}, 
"commit"=>"Save User" 
} 

UserController中#更新

def update 
@user = User.new(params[:user]) 
@user.save 
end 

窗體(它使用通用窗體構建器,可能會導致錯誤?)

<%= form_for :user, url: '/user/update', html: {multipart: true} do |user| %> 
    <%= user.hidden_field :name, {value: 'Alex'} %> 
    <%= user.fields_for :pics_attributes do |pic| %> 
    <%= pic.file_field :pic %> 
    <% end %> 
    <%= user.submit %> 
<% end %> 

用戶模型

class User < ActiveRecord::Base 
    attr_accessible :name, :pics_attributes 
    has_many :pics 
    accepts_nested_attributes_for :pics 
end 

照片管理模型

class Pics < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :image 
    mount_uploader :image, PicUploader 
end 

哪裏挖一個錯誤?

上面的代碼是用於Carrierwave,但我試圖切換到回形針和錯誤是相同的。

+0

解決這個骯髒的黑客:http://stackoverflow.com/questions/8514970/undefined-method-stringify-keys –

回答

1

你說你解決了這個問題,但我認爲你首先做錯了。

對於fields_for,您應該通過與nested_atributes_for中使用的值相同的值。因此 user.fields_for :pics_attributes應該是user.fields_for :pics

+0

我試過你的解決方案,但如果我只替換':pics_attributes'到':pics' - 它給我一個_「無法批量分配錯誤」_。此外,如果我在attr_accessible中將':pics_attributes'替換爲':pics' - 它會顯示_「Pic expected,got Array」_ –

+1

我發現嵌套窗體很糟糕。也就是說,如果你有'attr_accessible:pics_attributes'並且你的關係設置正確,'fields_for:pics'就可以工作。如果您的表單中沒有任何內容出現,那是因爲沒有相關的圖片。你需要在控制器中建立一個新的。 – agmin