我想把我的答案放在这里,与Stone的答案一起。我花了将近两天的时间让它工作(Stone说得对,这真是个令人头疼的问题!),所以希望我的解决方案能帮助到某些人。我和Stone的方法略有不同。
我的应用程序有
Features
(漫画,拼图,文本栏等)和
FeatureAssets
(单独的漫画面板/颜色版本,特定填字游戏的问答文件等)。由于
FeatureAssets
仅与一个
Feature
相关联,所以我将模型嵌套(如您在我的上传表单中所见)。
对我来说最大的问题是意识到发送到服务器的
params[:feature_asset]
实际上是我的上传者上传的
file
对象数组,而不仅仅是我习惯处理的那一个。经过一番尝试,通过迭代每个文件并从中创建一个FeatureAsset,它可以完美地工作!
希望我表达清楚。当你解释别人的代码时,多提供一点额外的背景知识总是有益的。
feature.rb
class Feature < ActiveRecord::Base
belongs_to :user
has_many :feature_assets
attr_accessible :name, :description, :user_id, :image
accepts_nested_attributes_for :feature_assets, :allow_destroy => true
validates :name, :presence => true
validates :user_id, :presence => true
mount_uploader :image, FeatureImageUploader
end
feature_asset.rb
belongs_to :user
belongs_to :feature
attr_accessible :user_id, :feature_id, :file, :file_cache
validates :user_id, :presence => true
validates :feature_id, :presence => true
validates :file, :presence => true
mount_uploader :file, FeatureAssetContentUploader
def to_jq_upload
{
"file" => file,
"file_name" => 'asdf',
"url" => file.url,
"delete_url" => id,
"delete_type" => "DELETE"
}
end
feature_assets_controller.rb
def create
@feature = Feature.find(params[:feature_id])
params[:feature_asset]['file'].each do |f|
@feature_asset = FeatureAsset.create!(:file => f, :feature_id => @feature.id, :user_id => current_user.id)
end
redirect_to @feature
end
虽然可能帮助不大,但我下面提供了feature_asset_uploader.rb文件。它非常简化。
class FeatureAssetContentUploader < CarrierWave::Uploader::Base
storage :file
end
功能 _form.html.erb(类似于Stone的,但不完全相同)
<%= form_for [@feature, @feature_asset], :html => { :multipart => true } do |f| %>
<div class="row" id="fileupload">
<div class=" fileupload-buttonbar">
<div class="progressbar fileupload-progressbar nofade"><div style="width:0%;"></div></div>
<span class="btn btn-primary fileinput-button">
<i class="icon-plus"></i>
<span><%= t('feature_assets.add_files') %>...</span>
<%= hidden_field_tag :feature_id, @feature.id %>
<%= hidden_field_tag :user_id, current_user.id %>
<%= f.file_field :file, :multiple => true %>
</span>
<button type="submit" class="btn btn-success">Start Upload</button>
<button type="reset" class="btn btn-warning">Cancel Upload</button>
<button type="button" class="btn btn-danger">Delete Files</button>
</div>
</div>
虽然这只是一个最基本的版本,没有错误处理或其他一些好用的功能,但它可以帮助某些人。如果您有任何问题,请随时向我提问!
Kyle