[英]Ruby on Rail, Carrierwave - File Upload fields disappear on form validation failure
[英]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.id
在store_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.