Carrierwave文件上载在ActiveRecord Create上验证失败

时间:2012-12-10 13:59:54

标签: ruby-on-rails ruby carrierwave

所以我有一个非常直接的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 %>

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

然而,在New / Create上我在:photo属性上收到验证错误,该错误只是说“Photo is Invalid”。上传者定义是vanilla:

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

Controller方法也很简单

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 个答案:

答案 0 :(得分: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

希望这有助于任何人。

答案 1 :(得分:0)

我有一个建议:

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

  def extension_white_list
   %w(jpg jpeg gif png)
  end

答案 2 :(得分: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更精简。

答案 3 :(得分:0)

很晚才到这里,但我遇到了同样的问题。

对我来说错误的是MiniMagick

我不得不删除我的代码并致电photo.save! 这给了我错误Avatar Failed to manipulate with MiniMagick

我从我的上传器文件中删除了Minimagick并且它有效。 所以我需要修复我的MiniMagick安装而不是我的代码。 希望这有助于某人。

相关问题