4

所以我有一个非常直接的 Carrierwave 实现用于图像上传。我已将上传器安装在 ActiveRecord 模型上:

class MenuItem < ActiveRecord::Base
    attr_accessible :description, :menu_id, :name, :active, :photo

    mount_uploader :photo, PhotoUploader

    belongs_to :menu

    before_save :default_values

    validates :name, presence: true
    validates :menu_id, presence: true
    validates :description, length: { maximum: 250 }

    private
       def default_values
         if (self.active.nil?)
           self.active = true
         end
       end  
end

我使用的表单结合了编辑/创建上述 MenuItem 以及附加文件:

    <%= form_for(@menuitem) do |f| %>
        <%= render 'shared/error_messages', object: @menuitem %>

        <%= f.file_field :photo, :id => "photo" %>

        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :description %>
        <%= f.text_area :description %>

        <%= f.label :active %>
        <%= f.check_box :active, :value => @menuitem.active %>

        <%= f.submit "Save Menu Item", class: "btn btn-large btn-primary" %>
        <%= f.submit "Cancel", class: "btn btn-large btn-secondary" %>
    <% end %>

在编辑/更新的情况下一切正常。

但是,在新建/创建时,我在 :photo 属性上收到了一个验证错误,它只是说“照片无效”。Uploader 的定义是普通的:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  after :store, :make_thumbnail

  storage :fog

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

  def make_thumbnail(file)
    a = filename.split('/')
    key = store_dir + "/" + a[0] + "/" + model.id.to_s + "_thumb.jpg"

    job = Blitline::Job.new(url)
    job.application_id = ENV['BLITLINE_APPLICATION_ID']

    sf = job.add_function("resize_to_fill", {:height => 100, :width => 100})
    sf.add_save("thumbnail", key, ENV['S3_BUCKET'])

    bs = Blitline.new
    bs.jobs << job   
    res = bs.post_jobs
  end
end

控制器方法也很简单

class MenuItemsController < ApplicationController
  def new
    @menuitem = MenuItem.new
    @menuitem.menu_id = params[:menuid]
    @menuitem.active = true
  end

  def create
    @menuitem = MenuItem.new(params[:menu_item])

    if @menuitem.save
        flash[:success] = "Menu Item created!"
        redirect_to menu_path(@menuitem.menu)
    else
        render 'new'
    end    
end

我认为问题可能与上传者方法中的引用有关,model.id并且store_dir由于尚未创建记录,因此 ID 不可用 - 但删除它并没有解决问题。

同样,使用相同表单并简单调用的编辑/更新路径menuitem.update_attributes(params[:menu_item])工作正常。

我敢肯定我缺少一些明显的东西。任何建议将不胜感激!

4

4 回答 4

1

您可以通过将 carrierwave.rb 初始化文件中的 ur_net_format 验证设置为 false 来修复错误。

像这样:

ruby
    config.validate_unique_filename = true
    config.validate_filename_format = true
    config.validate_remote_net_url_format = true

希望这对任何人都有帮助。

于 2014-04-06T12:36:36.443 回答
0

我有一个建议:

白名单格式(在您的上传器中):

  def extension_white_list
   %w(jpg jpeg gif png)
  end
于 2012-12-10T15:36:15.137 回答
0

您需要在 Carrierwave.rb 文件中设置以下内容

  config.validate_unique_filename = false
  config.validate_filename_format = false
  config.validate_remote_net_url_format = false # this is important

这对我有用。就个人而言,我现在使用carrierwave-aws,因为它比Fog 更精简。

于 2015-02-22T13:43:11.210 回答
0

来得很晚,但我也遇到了同样的问题。

对我来说错的是 MiniMagick

我不得不剥离我的代码并调用photo.save! 这给了我错误Avatar Failed to manipulate with MiniMagick

我从我的上传文件中删除了 Minimagick,它起作用了。所以我需要修复我的 MiniMagick 安装而不是我的代码。希望这可以帮助某人。

于 2016-09-02T15:44:44.923 回答