Isr*_*ael 5 ruby-on-rails has-many carrierwave ruby-on-rails-3.2
阶段
图像库应用程序.我有两个型号Handcraft和Photos.
一个手工艺品可能有很多照片,假设我有这样的模型:
Handcraft(name:string)Photo(filename:string, description:string, ...)在_form.html.erb手工艺品中,有:
<%= form_for @handcraft, html: {multipart: true} do |f| %>
# ... other model fields
<div class="field">
<%= f.label :photo %><br />
<%= f.file_field :photo %>
</div>
# ... submit button
<% end %>
Run Code Online (Sandbox Code Playgroud)
handcraft.rb 看起来像这样:
class Handcraft < ActiveRecord::Base
attr_accessible :photo
has_many :photos
mount_uploader :photo, PhotoUploader
# ...
end
Run Code Online (Sandbox Code Playgroud)
photo_uploader.rb:
class PhotoUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :thumb do
process :resize_to_limit => [100, 100]
end
def extension_white_list
%w(jpg jpeg gif png)
end
end
Run Code Online (Sandbox Code Playgroud)
问题
当我提交表单时,它会抛出此错误:
NoMethodError (undefined method `photo_will_change!' for #<Handcraft:0xb66de424>):
Run Code Online (Sandbox Code Playgroud)
题
在这种情况下我应该如何使用/配置Carrierwave?
pja*_*jam 11
您需要在将存储文件名的字段上安装上传器,因此您的模型应如下所示
class Handcraft < ActiveRecord::Base
attr_accessible :name
has_many :photos
# ...
end
class Photo < ActiveRecord::Base
attr_accessible :filename, :description
mount_uploader :filename, PhotoUploader
# ...
end
Run Code Online (Sandbox Code Playgroud)
然后看起来你将通过手工形式创建照片,你应该添加
accepts_nested_attributes_for :photos
Run Code Online (Sandbox Code Playgroud)
在你的Handcraft班上
然后你的表格看起来像
<%= form_for @handcraft, html: {multipart: true} do |f| %>
# ... other model fields
<%= f.fields_for :photos do |photo| %>
<%= photo.label :photo %><br />
<%= photo.file_field :photo %>
<% end %>
# ... submit button
<% end %>
Run Code Online (Sandbox Code Playgroud)
对于显示照片字段的表单,您需要创建Handcraft实例photos,这可以通过以下方式在您的new方法中完成HandcraftsController:
def new
@handcraft = Handcraft.new
4.times { @handcraft.photos.build }
end
Run Code Online (Sandbox Code Playgroud)
这将使您的表单中有4个(任意数字)字段可用,如果您希望用户以某种方式在表单中动态添加新照片,请查看nested_form