RoR:Carrierwave文件上传 - 无法将nil转换为String

时间:2015-10-11 12:47:00

标签: ruby-on-rails file upload carrierwave

我已尝试按carrierwave gem自述文件中的建议实施多文件上传。

提供错误的行无法将nil转换为字符串'是

@event = Event.new(event_params) 

来自我的创建动作。 <{1}}由

定义
event_params

在表单视图中,文件字段由

指定
params.require(:event).permit(:name, :description, ... lots of params ..., {images: []})

当我删除此行时,它会消除错误,但显然不会上传文件。即使我在此字段中选择了多个文件,也会发生错误。有谁知道出了什么问题?

<%= f.file_field :images, multiple: true %>

app/models/event.rb

class Event < ActiveRecord::Base
  has_many :swipes
  has_many :event_images
  accepts_nested_attributes_for :event_images
  mount_uploader :headerImage, HeaderImageUploader
  mount_uploader :images, ImagesUploader
  geocoded_by :full_street_address
  after_validation :geocode, :if => :address_changed?
  after_validation :reverse_geocode, :if => :latitude_changed?
  # Event validations
  validates :name, :presence => true, length: { in: 5..30 }           
  validates :title, :presence => true, length: { in: 5..60 }
  validates :description, :presence => true, length: { in: 5..2500 }
  validates :headerImage, :presence => true
  validates :venue, :presence => true
  validates :street_address, :presence => true
  validates :post_code, :presence => true
  validate :check_begin_time
  validates :price, :presence => true
  validates :host_name, :presence => true

  def check_begin_time
    if door_time.blank? and start_time.blank?
        errors.add(:base, 'At least one of "door time" and "start time" must be filled in')
     #one at least must be filled in, add a custom error message
     return false
    else
     return true
    end
  end


  def full_street_address
    [venue, street_address, town, post_code, country].compact.join(', ')
  end

  def address_changed?
    attrs = %w(venue street_address town country)
    attrs.any?{|a| send "#{a}_changed?"}
  end

end

这是我的表单发送的HTTP请求。

app/uploaders/images_uploader.rb

class ImagesUploader < CarrierWave::Uploader::Base
  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

2 个答案:

答案 0 :(得分:0)

您需要正确设置CarrierWave目录:

CarrierWave.configure do |config|
  config.root = File.expand_path '../public', __FILE__
end

答案 1 :(得分:0)

在您的event.rb模型中

应该是:mount_uploaders :images, ImagesUploader而不是mount_uploader