Rails:通过Carrierwave将图像上传到Amazon S3只能在“编辑”上工作

4

图片属于帖子

图片上传器可以工作,但只有当我在帖子编辑时上传图片。我希望在创建帖子时就能上传图片。

图片上传(“<%= f.file_field :image %>”)位于新帖子表单中,因此我猜测Carrierwave试图在创建帖子之前将图片上传到指定路径,导致它不知道在哪里上传。

这是ImageUploader文件:

class TrackImageUploader < CarrierWave::Uploader::Base
  def cache_dir
   "#{Rails.root}/tmp/uploads"
  end

 include CarrierWave::RMagick

 #storage :file
 #storage :fog

 def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
 end

 version :featured do
   process :resize_to_fill => [210, 145]
 end

 def extension_white_list
   %w(jpg jpeg gif png)
 end
end

从上面的代码中我猜测store_dir负责在Amazon S3上按照相应路径保存图像。

我该怎么做才能让它在发布后上传图像,以便可以获取Post.id?


你能同时发布模型代码吗? - John
嗯,你可以尝试在模型中玩弄AR回调函数,看看是否强制保存有所帮助。http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html - John
最终,如果您的代码托管在GitHub或任何类似的网站上,您能否给我们提供应用程序的链接,以便我们可以尝试玩耍并找到问题? - pjam
http://onvard.com/curators_guide - 这是网站。您只需点击绿色按钮,然后在其中上传一张图片。目前,图片确实可以上传,但都变形了。但是当我们编辑轨道并上传相同的图片时,图片会被调整大小以完美适应。很奇怪... - kibaekr
@regulatethis 给你!https://gist.github.com/4274025 - kibaekr
显示剩余2条评论
2个回答

1
我曾经也遇到过同样的问题,但我已找到解决方法。
我的ImageUploader.rb文件如下: https://gist.github.com/egbertp/7572501。在该文件的第9行中,你会看到include CarrierWaveDirect::Uploader。通过使用直接上传技术,您的网站用户将直接将文件上传到Rackspace云。然而,在上传时,Image模型尚未在您的数据库中创建,从而导致错误(正如您所猜测的那样)。
通过禁用直接上传技术,网站用户将首先将图像发送到您的Web服务器,然后Image模型将被创建并保存在数据库中。在我的ImageUploader类中,这也是必要的,因为我希望我的Web服务器处理图像,以创建缩略图版本。
希望这能帮助您或将来的其他人。
最好的问候, Egbert

0

我也做了同样的事情,但我使用了Cloudinary gem来维护我的图片。你能否展示一下你编写编辑操作的控制器代码呢?

在控制器的编辑操作中。

def create
 @img = Image.new(params[:img])
  if @img.save
    redirect_to(:action => 'show')
  else
    render('c_view')
  end
end 

在获取图像的视图中

<%= form_for :img, :url => {:action => "create"} do |f| %>
 <%= f.label "Upload an image"%>
    <%= f.hidden_field(:image_cache)%>
    <%= f.file_field :image %>      

 <%= f.submit "Submit", class: "btn btn-success"%>
    <% end %>

展示图片在某个视图页面上,我使用了这个:
<% @img.each_with_index do |i|%>    
     <%= image_tag (i.image.url) %>
<%end%>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接