【问题标题】:Rails upload form with carrierwave and polymorphic associations带有载波和多态关联的 Rails 上传表单
【发布时间】:2013-04-13 17:07:49
【问题描述】:

我正在尝试使用多态关联来减少文件管理在一个简单的 Rails 应用程序中的重复性。我正在使用carrierwave来处理文件上传。到目前为止,这是我所拥有的:

app/uploaders/file_uploader.rb

class FileUploader < CarrierWave::Uploader::Base
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

app/models/attachment.rb

class Attachment < ActiveRecord::Base
  mount_uploader :file, FileUploader
  belongs_to :attachable, polymorphic: true
end

app/models/photo.rb

class Photo < ActiveRecord::Base
  attr_accessible :caption, :attachment
  has_one :attachment, as: :attachable
end

我可以在 Rails 控制台中处理这个问题:

$ rails console
> photo = Photo.new
> attachment = Attachment.new
> attachment.file = File.open('tmp/demo.png')
> photo.attachment = attachment
> photo.save
> photo.attachment
=> #<Attachment id: 3, file: "demo.png", attachable_id: 5, attachable_type: "Photo", created_at: "2013-04-13 16:56:31", updated_at: "2013-04-13 16:56:31">

所以我的问题确实出在照片控制器上:

ActiveRecord::AssociationTypeMismatch in PhotosController#create
Attachment(#70310274945400) expected, got ActionDispatch::Http::UploadedFile(#70310271741380)`

非常感谢您对此的任何帮助。我可能对多态关联没有最大的了解。

更新

根据@manoj 的建议,我编辑了照片表单以嵌套附件:

<%= f.fields_for :attachment do |attachment_f| %>
    <%= attachment_f.file_field :file %>
<% end %>

我现在在尝试提交表单时收到此错误:

ActiveRecord::AssociationTypeMismatch (Attachment(#70135925415240) expected, got ActiveSupport::HashWithIndifferentAccess(#70135923190420)):
app/controllers/photos_controller.rb:43:in 'new'
app/controllers/photos_controller.rb:43:in 'create'

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 polymorphism carrierwave polymorphic-associations


    【解决方案1】:

    post 参数应该是这样的

    params => { "photo" => 
                   { :attachment_attribute => 
                      {:file => ActionDispatch::Http::UploadedFile}
                   }
              }
    

    但你的帖子参数很可能是

    params => { "photo" => { :attachment => ActionDispatch::Http::UploadedFile}}
    

    您的视图应该包含 fields_for 来处理模型中的嵌套。您必须为附件模型的属性“文件”创建一个文件字段

    <%=form_for @photo do |photo_f|%>
      ....
      <%=photo_f.fields_for :attachment do |attachment_f|%>
         <%= attachment_f.file_field :file%>
      <%end%>
      ....
    <%end%>
    

    更新

    <%=photo_f.fields_for :attachment_attributes do |attachment_f|%>
    

    并在照片模型中添加这些,

    accepts_nested_attributes_for :attachment
    attr_accessible ..., :attachment_attributes
    

    【讨论】:

    • 感谢@manoj 的帮助。我想我越来越近了,但我收到了上述错误(请参阅我的问题的更新)
    • 帮助我的是 ANAF 的东西。感谢您唤醒我的记忆!
    【解决方案2】:
    <%=form_for @photo do |photo_f|%>
     ....
     <%=photo_f.fields_for :attachment_attributes do |attachment_f|%>
      <%= attachment_f.file_field :file %>
     <%end%>
     ....
    <%end%>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多