这是一个非常常见的错误,我已经通过了许多答案,但没有任何对我有用。在我出错的地方,你能帮忙吗?
场景:我有一个项目和图片表,当用户添加项目时,他/她必须添加至少一个图片。当我在附加图像后保存表单时,它会出错。代码片段和错误屏幕截图如下:
item.rb的
class Item < ApplicationRecord
belongs_to :user, class_name: 'User', foreign_key: :user_id
has_many :images, class_name: 'Image', foreign_key: :item_id, dependent: :destroy
accepts_nested_attributes_for :images, allow_destroy: true
end
image.rb
class Image < ApplicationRecord
belongs_to :item, foreign_key: :item_id, optional: true
has_attached_file :image, styles: { small: '64x64', med: '100x100', large: '200x200' },
default_url: '/images/:id/:filename'
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
items_controller.rb
class ItemsController < ApplicationController
def new
@item = Item.new
@item.images.build
#new.html.erb
end
def create
@item = Item.new(item_params.merge(user_id: current_user.id))
if @item.save
redirect_to items_path
else
render :new
end
end
private
def item_params
params.require(:item).permit(:name, :category, :qty, :cost, :description,
:city, :postal_code, :country,
images_attributes: [:id, :item_id, :_destroy, image: []])
end
end
new.html.erb
<div class="container">
<h2> <% if current_user.items.blank? %> Become a seller! <% end %> Add a new item </h2> <br>
<%= form_for @item, url: {action: :create}, html: { multipart: true } do |f| %>
<%= item_error_messages! %>
<div class="form-group">
<%= f.label :name, class:'control-label col-sm-2' %>
<div class="col-sm-10">
<%= f.text_field :name, class: 'form-control', placeholder: 'Enter name' %>
</div>
</div>
<%= f.fields_for :images, @item.images.build do |img| %>
<%= img.file_field :image, multiple: true %>
<% end%>
<br><br>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10" style="margin-bottom: 40px;">
<%= f.submit 'Save', class:'btn btn-default' %>
</div>
</div>
<% end %>
</div>
错误:
可能出现什么问题?我读过的大多数解决方案建议在表单标记中添加multipart: true
,但它已经存在。
由于
答案 0 :(得分:0)
我认为您的问题与您尝试为每个模型保存多个附加文件这一事实有关。显然,Paperclip并不能很好地对待这个案例,所以你需要自己动手。
如果您想同时保存多个文件,可以按照下面链接中的接受答案示例如何实现:
以下链接中的简历:
1 - 要在上面的例子中保存多个文件,不需要添加 multiple:true选项,保存时会导致错误。
2 - 关于params:这会导致错误,因为模型不知道如何处理图像数组
3 - 要同时保存多个文件,您需要使用自己的文件 处理
Rails 4 multiple file attachments with Paperclip
祝你好运!<强> #UPDATE 强>
关于如何一次保存多个文件的想法:
1 - 您需要有一个动态输入文件的表单。 因此,每个输入都可以获取每个文件的条目。你可以做到这一点 编写自己的.js lib或使用像“Cocoon”这样的宝石。你将会 在这里使用嵌套属性。
2 - 控制器中的强参数将接受您的项目 模型和文件数组。
3 - 您必须编辑方法以保存数据。例如(在您的 case @ item.save不起作用,因为它不是设计的回形针 接受一组文件)。因此,在您的项目模型中,您将不得不这样做 写一个类似下面的方法:
(pseudo-code)
def save(item_attributes, array_of_files)
@item = Item.new( -- add here only Item attributes --)
@item.save
# Here you are creating a model file for each file you are saving.
# So there will be N file model for 1 item.
for file in array_of_files
@file = File.new( @item.id, file)
@file.save
end
# here you can implement transaction in case a error occurs.
# and shows the error to your client through Item model
# google how to do this (transaction and Active Record class).
end