class Release < ActiveRecord::Base has_many :releases_tracks,:dependent => :destroy has_many :tracks,:through => :releases_tracks,:order => "releases_tracks.position DESC" accepts_nested_attributes_for :tracks,:reject_if => lambda { |a| a[:name].blank? },:allow_destroy => :true accepts_nested_attributes_for :releases_tracks end class Track < ActiveRecord::Base mount_uploader :track,TrackUploader has_many :releases_tracks,:dependent => :destroy has_many :releases,:through => :releases_tracks end
/views/releases/track_upload.html.erb
<%= form_for(@release,:html => { :multipart => true }) do |f| %> <h3>Upload Tracks for <%= @release.title %></h3> <% index = 0 %> <%= f.fields_for :tracks do |builder| %> <%= @release.tracks[index].name %> <%= f.file_field :track,:class => "file styled",:title => 'Select Track'%> <% index += 1 %> <% end %> <%= f.submit "Upload Tracks",:class => "submit" %> <% end %>
Carrierwave上传工作正常,但我无法弄清楚如何让直接部分工作.部分是因为我无法弄清楚如何合并建议的表单代码:
<%= direct_upload_form_for @uploader do |f| %> <%= f.file_field :track %> <%= f.submit %> <% end %
或者在我的轨道或释放控制器的位置我放置建议:
@uploader = User.new.track @uploader.success_action_redirect = new_user_url
自述文件https://github.com/dwilkie/carrierwave_direct和Railscast http://railscasts.com/episodes/383-uploading-to-amazon-s3都指向先上传文件然后创建数据库条目.在我的应用程序中,db条目已存在. Railscast确实说它有可能但不会经历它.这是第一个问题.
第二是我需要一次上传多个文件.上面的代码确实实现了这一点,但速度非常慢,它当然会让我的应用程序变得毫无用处.
有人可以帮忙吗?非常感谢提前!
解决方法
其中一个原因是,正如文档中所述
Please be aware that this gem only supports single
file uploads. If you want to upload multiple files simultaneously
you’ll have to use a javascript or flash uploader.
但是如果你想使用它,我猜你必须这样做:
首先是关于
@uploader = User.new.track @uploader.success_action_redirect = new_user_url
您似乎正在尝试上传曲目,正如您所说,您的模型已经创建,我想您正在尝试为现有版本上传新曲目.如我错了请纠正我.
所以你应该在ReleasesController的#track_upload方法中创建@uploader var.
class ReleasesController ... def track_update @uploader = User.new.track @uploader.success_action_redirect = new_user_url end ... end
然后在关联视图(/views/releases/track_upload.html.erb)中,您可以使用direct_upload_form
<%= direct_upload_form_for @uploader do |f| %> <%= f.file_field :track %> <%= f.submit %> <% end %>
在您选择文件后,表单将文件直接上传到s3.然后我不确切知道怎么做,但是carrierwave_direct会给你回上传文件的url.
我不确定,因为我从来没有这么远,但是想法是你的文件刚刚上传到s3,现在它必须链接到你的模型,所以文件不会丢失”.
所以也许carrierwave_direct通过做一些ajax请求或其他任何东西来自己做事(我怀疑……).
无论如何,因为你想上传多个文件,我想指向你一个tutorial I recently wrote
这显示了如何在没有carrierwave_direct的情况下直接将文件上传到s3,而是通过自己做事情.这需要更多的代码和时间,但您可以更好地控制正在发生的事情.
在您的情况下,您需要在视图中的/views/releases/track_upload.html.erb视图中将我正在使用的表单放在您的教程中.
然后,一旦你选择了一个文件,成功的AJAX请求(由jQueryFileUpload插件发出)将为你提供上传文件的URL,这样你就可以将它保存在Track模型中(你可能想要发出一个新的AJAX请求)在您的服务器上创建新的Track模型,或填充页面上的其他表单,如您在/views/releases/track_upload.html.erb文件中使用的表单,然后将在提交时保存曲目. )
我不确定我是否真的很清楚,如果您需要更多解释,请告诉我.
这样做的好处是,如果您只是在文件输入中添加多个,那么真棒jQueryFileUpload插件会将每个文件的请求发送到s3,然后您将获得每个ajax结果中上传文件的URL:D
你可以通过jQuery插件调整添加进度条和类似的东西,你可以真正创建出色的东西.
希望它能帮到你!