Chciałem rzucić moją odpowiedź tutaj jak Stone'a. Spędziłem prawie dwa solidne dni, aby to zadziałało (Stone miał rację, to była PITA!), Więc mam nadzieję, że moje rozwiązanie pomoże komuś. Zrobiłem to tylko dotyk inny niż Stone.
Moja aplikacja ma Features
(komiks, puzzle, text-kolumnę, etc) oraz FeatureAssets
(wersje indywidualne panele komiks/kolorów, pytanie & plików odpowiedzi dla konkretnej krzyżówki, etc). Od FeatureAssets
są wyłącznie związane z jednym Feature
, zagnieżdżiłem modele (jak widać w moim formularzu przesyłania).
Największym problemem dla mnie było to, że mój params[:feature_asset]
, który był wysyłany na serwer, był w rzeczywistości zbiorem obiektów uploader'd file
, zamiast tylko tych, z którymi byłem przyzwyczajony. Po odrobinie błahostki z iterowaniem każdego pliku i utworzeniem z niego FeatureAsset działało jak czar!
Mam nadzieję, że przetłumaczyć to wyraźnie. Wolałbym podać trochę za dużo informacji niż za mało. Trochę dodatkowego kontekstu nigdy nie boli, gdy interpretujesz czyjś kod.
funkcja.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
I nie to, że prawdopodobnie pomaga że dużo, ale mój feature_asset_uploader.rb jest poniżej. Jest dość rozebrany.
class FeatureAssetContentUploader < CarrierWave::Uploader::Base
storage :file
end
wyposażony _form.html.erb (podobny do Stone'a, ale nie całkiem)
<%= 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>
Nie ma obsługi błędów lub jakiejkolwiek subtelności powinien mieć, ale to wersja Barebone tego.
Mam nadzieję, że pomaga komuś tam. Nie wahaj się zapytać mnie, jeśli masz jakieś pytania!
Kyle
Hej, Mam podobny problem, w którym nie mogę użyć pliku JQuery-File-Upload z gemem nested_form. Czy byłeś w stanie znaleźć rozwiązanie tego problemu? –
Pytasz o przesłanie AJAX-a, tak jak w pliku wysyłanym, podczas gdy użytkownik nadal wypełnia resztę formularza, tak? Czy pracujesz z obrazami lub po prostu plikami? A czy model załącznika ma w sobie coś innego niż pliki - jakiekolwiek zatwierdzenia itp.? – Andrew