未定义的方法`[]'用于#<actiondispatch :: http :: uploadedfile:0x007fae8c0bfaa8> </actiondispatch :: http :: uploadedfile:0x007fae8c0bfaa8>

时间:2014-01-16 07:57:48

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-3.1

我在file_field列中嵌套了表单,当我尝试创建它时抛出 UserController#update中的NoMethodError 对于#

,未定义的方法`[]'
{
 "utf8"=>"✓",
 "authenticity_token"=>"HFWawKp4RH7+AFV0yQ1cXpzxHDfubKTKkiDiS6QKnJk=",
 "user"=> { 
  "name"=>"Test",
  "image_attributes"=> { 
    "picture"=>#<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"
}

我的模特

class User < ActiveRecord::Base
  attr_accessbile: :name, image_attributes
  has_many :images
  accepts_nested_attributes_for: images
end

class Image < ActiveRecord::Base
  belongs_to :verve_app
  mount_uploader picture, PictureUploader
end

我的控制器

def new
  @user = User.new
  @user.images.build
end

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

我的观点

<%= form_for @user do |f| %>
  <%= f.hidden_field :name, {value: 'Alex'} %>
  <%= f.fields_for :image_attributes do |image| %>
    <%= image.file_field :picture %>
  <% end %>
  <%= user.submit %>
<% end %>

3 个答案:

答案 0 :(得分:0)

尝试在模型类上调用fields_for:image而不是on:image_attributes。

替换你的&lt;%= f.fields_for:image_attributes do | image | %GT; &lt;%= f.fields_for:image do | i | %取代。然后将image.file_field更改为i.file_field

看看这是否有帮助,或者至少为我们提供了新的错误。

答案 1 :(得分:0)

不要忘记你的模型类应该包含上传者的钩子: - )

mount_uploader :picture, PictureUploader

答案 2 :(得分:0)

是否可能是因为表单需要阅读:

<% f.fields_for :images_attributes do |image| %>(请注意复数)

据我了解,在调用x_attributes时,x需要匹配在模型中声明属性的方式。在这种情况下,它是accepts_nested_attributes_for :images

设置的