我正在尝试使用Carrierwave上传多个文件。我尝试添加多文件功能,如Carrierwave的github页面所示,但老实说这是最糟糕的事情。我找到了一个很好的来源,可以通过以下步骤上传多个文件。
1)rails new multiple_image_upload_carrierwave
2)
rails g scaffold post_attachment post_id:integer type_id:integer avatar:string
rake db:migrate
3)在post.rb
class Post < ActiveRecord::Base
has_many :post_attachments
accepts_nested_attributes_for :post_attachments
end
4)在post_attachments.rb
中class PostAttachment < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
belongs_to :post
end
5)在post_controller.rb
中def show
@post_attachments = @post.post_attachments.all
end
def new
@post = Post.new
@post_attachment = @post.post_attachments.build
end
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
params[:post_attachments]['avatar'].each do |a|
@post_attachment = @post.post_attachments.create!(:avatar => a, :post_id => @post.id)
end
format.html { redirect_to @post, notice: 'Post was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
def update
respond_to do |format|
if @post.update(post_params)
params[:post_attachments]['avatar'].each do |a|
@post_attachment = @post.post_attachments.create!(:avatar => a, :post_id => @post.id)
end
end
end
def destroy
@post.destroy
respond_to do |format|
format.html { redirect_to @post }
format.json { head :no_content }
end
end
private
def post_params
params.require(:post).permit(:title, post_attachments_attributes: [:id, :post_id, :avatar])
end
我的问题是,安装在头像字段中并上传的每个文件(.pdf)在.pdf扩展之前都有一个唯一的后缀标识符。例如XCF.pdf和BJHA.pdf。我有一个类型表,其中一列被称为“后缀”。之前,当我只有一个文件上传时,它会检查create方法,看看文件名扩展名的第一部分(在.pdf之前)是否存在于后缀列下的types表中,如果是的话,它是将该type_id分配给该帖子文件。如果没有找到后缀,则会出现验证错误。但现在我有多个文件上传,我有一个额外的表名为post_attachments表,我不知道我应该在哪里执行此步骤来填充每个文件的type_id,因为每个文件都有自己的type_id。应该在create方法的post_atachment_controller.rb中完成吗?
我想在post_controler.rb中的if @ post.save之后可能在create函数中
if @post.save
params[:post_attachments]['avatar'].each do |a|
@type = Type.where("sufix LIKE a.tr(.pdf,"")")
if @type.exits?
@post_attachment = @post.post_attachments.create!(:avatar => a, :post_id => @post.id, :type_id => @type.id)
end