Я просто хотел бросить здесь свой ответ так же, как и у Стоуна.Я потратил почти два трудных дня, чтобы заставить это работать (Стоун был прав, это была PITA!), Так что, надеюсь, мое решение кому-нибудь поможет.Я сделал это просто прикосновением, отличным от 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
# 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>
В нем нет обработки ошибок или каких-либо тонкостейтак и должно быть, но это босоногая версия.
Надеюсь, это поможет кому-то там.Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы!
Кайл