簡體   English   中英

Carrierwave文件上載在ActiveRecord Create上驗證失敗

[英]Carrierwave file upload fails validation on ActiveRecord Create

所以我有一個非常直接的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.idstore_dir上傳的方法,由於記錄還沒有被創建的ID是不可用-但在移除沒有幫助的問題。

同樣,使用相同表單的編輯/更新路徑只需調用menuitem.update_attributes(params[:menu_item])可以正常工作。

我確信有一些顯而易見的東西我不見了。 任何建議將不勝感激!

您可以通過將carrierwave.rb初始化程序文件中的 - ur_net_format驗證設置為false來修復錯誤。

像這樣:

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

希望這有助於任何人。

我有一個建議:

白名單格式(在您的上傳器中):

  def extension_white_list
   %w(jpg jpeg gif png)
  end

您需要在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更精簡。

很晚才到這里,但我遇到了同樣的問題。

對我來說錯誤的是MiniMagick

我不得不剝離我的代碼並致電photo.save! 這給了我錯誤Avatar Failed to manipulate with MiniMagick

我從我的上傳器文件中刪除了Minimagick並且它有效。 所以我需要修復我的MiniMagick安裝而不是我的代碼。 希望這有助於某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM