我正在尝试使用某些字段创建酒店,其中一个字段是照片,我想使用带有carrierwave和nested_form的多个文件上传。我找到了article 并有一些结果。
当我在/hotels/new时,填写字段,选择照片 并按提交,在HotelsController#中获取 ActiveRecord :: UnknownAttributeError创建未知属性:attachable_type。 的控制台
Started POST "/hotels" for 127.0.0.1 at 2013-09-27 17:35:18 +0300
Processing by HotelsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"+1T2tuygSnj8unOKkXkRWI4L7KvDE
9PPHrqvag7KmIQ=", "hotel"=>{"title"=>"dsa", "address"=>"asd", "star_rating"=>"2"
, "breakfast"=>"Not include", "price_for_room"=>"sadas", "room_description"=>"Gr
eat room", "attachments_attributes"=>{"1380289954031"=>{"file"=>#<ActionDispatch
::Http::UploadedFile:0xa5d546c @original_filename="11374.jpg", @content_type="im
age/jpeg", @headers="Content-Disposition: form-data; name=\"hotel[attachments_at
tributes][1380289954031][file]\"; filename=\"11374.jpg\"\r\nContent-Type: image/
jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20130927-7077-50zkol>>, "_destroy"
=>"false"}, "1380289972216"=>{"file"=>#<ActionDispatch::Http::UploadedFile:0xa5d
53a4 @original_filename="357175.jpg", @content_type="image/jpeg", @headers="Cont
ent-Disposition: form-data; name=\"hotel[attachments_attributes][1380289972216][
file]\"; filename=\"357175.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<F
ile:/tmp/RackMultipart20130927-7077-dlkmwk>>, "_destroy"=>"false"}}}, "commit"=>
"Done"}
Completed 500 Internal Server Error in 109ms
ActiveRecord::UnknownAttributeError (unknown attribute: attachable_type):
app/controllers/hotels_controller.rb:15:in `new'
app/controllers/hotels_controller.rb:15:in `create'
...
型号hotel.rb
class Hotel < ActiveRecord::Base
attr_accessible :address, :breakfast, :price_for_room, :room_description,
:star_rating, :title, :attachments_attributes
has_many :attachments, :as => :attachable
accepts_nested_attributes_for :attachments
end
型号attachment.rb
class Attachment < ActiveRecord::Base
attr_accessible :file
belongs_to :attachable, :polymorphic => true
mount_uploader :file, FileUploader
end
hotels_controller.rb
...
def new
@hotel = Hotel.new
end
def create
@hotel = Hotel.new(params[:hotel])
if @hotel.save
redirect_to hotels_path, notice: "Nice, you added new hotel " + @hotel.title
else
render "new"
end
end
_form.rb
<%= nested_form_for @hotel, :html => {:multipart => true} do |f| %>
...
<%= f.fields_for :attachments do |attachment_form|%>
<%= attachment_form.label :file %>
<%= attachment_form.file_field :file %>
<%= attachment_form.link_to_remove "Remove this photo" %>
<% end %>
<%= f.link_to_add "Add photo", :attachments %>
<%= f.submit 'Done', class: 'btn btn-success' %>
<% end %>
任何想法的家伙?我在这里做错了什么?
答案 0 :(得分:8)
ActiveRecord :: UnknownAttributeError意味着您缺少数据库中的字段。在您设置多态关系时,或者您忘记运行迁移时,您似乎错过了一个字段。
另请参阅:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
答案 1 :(得分:0)
尝试创建文件名 应用/上传/ photo_uploader.rb 强>
# encoding: utf-8
class PhotoUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
include CarrierWave::RMagick
# include CarrierWave::MiniMagick
include Sprockets::Helpers::RailsHelper
include Sprockets::Helpers::IsolatedHelper
include CarrierWave::MimeTypes
process :set_content_type
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def extension_white_list
%w(jpg jpeg gif png)
end
# process :resize_to_fit => [800, 800]
version :thumb do
process :resize_to_limit => [50, 50]
end
end
然后在你的模型中添加
mount_uploader :image, PhotoUploader
mount_uploader :image2, PhotoUploader
你可能有这个
/config/initializers/carrierwave.rb
CarrierWave.configure do |config|
config.storage = :fog
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => ENV['CARRIER_WAVE_ACCESS_KEY'],
:aws_secret_access_key => ENV['CARRIER_WAVE_SECRET_ACCESS_KEY']
}
config.cache_dir = "#{Rails.root}/tmp/uploads"
config.fog_directory = ENV['CARRIER_WAVE_BUCKET']
config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' }
#config.fog_public = false # optional, defaults to true
end