我只是想把我的答案和斯通的答案一样扔在这里。我花了将近两天的时间让这个工作(斯通是对的,它是一个 PITA!),所以希望我的解决方案能对某人有所帮助。我做的只是一点点与斯通不同。
我的应用程序有Features
(漫画、拼图、文本栏等)和FeatureAssets
(单独的漫画面板/彩色版本、特定填字游戏的问答文件等)。由于FeatureAssets
仅与 one 相关Feature
,因此我嵌套了模型(您将在我的上传表单中看到)。
对我来说最大的问题是意识到我params[:feature_asset]
被发送到服务器的实际上是一组上传者的file
对象,而不仅仅是我习惯使用的对象。在迭代每个文件并从中创建一个 FeatureAsset 之后,它就像一个魅力!
希望我能清楚地翻译这个。我宁愿提供太多信息而不是不够。当您解释别人的代码时,一点额外的上下文永远不会受到伤害。
特征.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
特征资产.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
# grabs useful file attributes & sends them as JSON to the jQuery file uploader
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
features _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>
它没有错误处理或它应该有的任何细节,但那是它的准系统版本。
希望这可以帮助那里的人。如果您有任何问题,请随时问我!
凯尔