Rails 管理员 - 未定义使用 Carrierwave 多重上传的方法“”
Rails Admin - undefined method `' for using Carrierwave multiple upload
使用 Carrierwave 上传多个文件后,我无法在 Rails Admin 中编辑某些记录。
我想配置正确,当我上传文件时一切顺利,但如果我在保存记录后尝试编辑,则会发生错误:
.log:
14:33:56 web.1 | Started POST "/admin/__better_errors/563c2613b62e459f/variables" for 127.0.0.1 at 2018-11-21 14:33:56 -0200
14:33:56 web.1 | Tag Load (0.6ms) SELECT "tags".* FROM "tags" INNER JOIN "projects_tags" ON "tags"."id" = "projects_tags"."tag_id" WHERE "projects_tags"."project_id" = LIMIT [["project_id", 75],["LIMIT", 11]]
14:33:56 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:50 web.1 | Started GET "/admin/project/75/edit" for 127.0.0.1 at 2018-11-21 14:34:50 -0200
14:34:50 web.1 | Processing by RailsAdmin::MainController#edit as HTML
14:34:50 web.1 | Parameters: {"model_name"=>"project", "id"=>"75"}
14:34:50 web.1 | Admin Load (0.4ms) SELECT "admins".* FROM "admins" WHERE "admins"."id" = ORDER BY "admins"."id" ASC LIMIT [["id", 1], ["LIMIT", 1]]
14:34:50 web.1 | ↳ config/initializers/rails_admin.rb:9
14:34:50 web.1 | Project Load (2.1ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ORDER BY "projects"."id" ASC LIMIT [["id", 75], ["LIMIT", 1]]
14:34:50 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Rendering /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/edit.html.haml within layouts/rails_admin/application
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_field.html.haml (3.8ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (31.4ms)
14:34:51 web.1 | Tag Load (0.5ms) SELECT "tags".* FROM "tags" INNER JOIN "projects_tags" ON "tags"."id" = "projects_tags"."tag_id" WHERE "projects_tags"."project_id" = [["project_id", 75]]
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | (0.4ms) SELECT COUNT(*) FROM "tags"
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Tag Load (0.5ms) SELECT "tags".* FROM "tags" ORDER BY tags.id desc
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_filtering_multiselect.html.haml (22.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_file_upload.html.haml (13.9ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_multiple_file_upload.html.haml (45.1ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/edit.html.haml within layouts/rails_admin/application (623.9ms)
14:34:51 web.1 | Completed 500 Internal Server Error in 800ms (ActiveRecord: 3.9ms)
14:34:51 web.1 |
14:34:51 web.1 |
14:34:51 web.1 |
14:34:51 web.1 | NoMethodError - undefined method `' for #<Project:0x00007fb7cfa36900>:
14:34:51 web.1 |
rails_admin.rb:
config.model Project do
edit do
field :title
field :headline
field :images, :multiple_carrierwave
end
end
ProjectImageUploader.rb
class ProjectImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
include CarrierWave::ImageOptimizer
process optimize: [{ quality: 85 }]
storage :file
version :normal do
process :efficient_conversion => [640, 960]
end
def store_dir
"system/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
private
def efficient_conversion(width, height)
manipulate! do |img|
img.combine_options do |c|
c.fuzz "3%"
c.trim
c.resize "#{width}x#{height}>"
c.resize "#{width}x#{height}<"
end
img
end
end
end
项目模型:
mount_uploaders :images, ProjectImageUploader
我遇到了同样的问题,将此方法添加到模型中帮助了我:
attr_accessor :delete_images
after_validation do
uploaders = images.delete_if do |uploader|
if Array(delete_images).include?(uploader.file.identifier)
uploader.remove!
true
end
end
write_attribute(:images, uploaders.map { |uploader| uploader.file.identifier })
end
def images=(files)
appended = files.map do |file|
uploader = _mounter(:images).blank_uploader
uploader.cache! file
uploader
end
super(images + appended)
end
使用 Carrierwave 上传多个文件后,我无法在 Rails Admin 中编辑某些记录。
我想配置正确,当我上传文件时一切顺利,但如果我在保存记录后尝试编辑,则会发生错误:
.log:
14:33:56 web.1 | Started POST "/admin/__better_errors/563c2613b62e459f/variables" for 127.0.0.1 at 2018-11-21 14:33:56 -0200
14:33:56 web.1 | Tag Load (0.6ms) SELECT "tags".* FROM "tags" INNER JOIN "projects_tags" ON "tags"."id" = "projects_tags"."tag_id" WHERE "projects_tags"."project_id" = LIMIT [["project_id", 75],["LIMIT", 11]]
14:33:56 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:50 web.1 | Started GET "/admin/project/75/edit" for 127.0.0.1 at 2018-11-21 14:34:50 -0200
14:34:50 web.1 | Processing by RailsAdmin::MainController#edit as HTML
14:34:50 web.1 | Parameters: {"model_name"=>"project", "id"=>"75"}
14:34:50 web.1 | Admin Load (0.4ms) SELECT "admins".* FROM "admins" WHERE "admins"."id" = ORDER BY "admins"."id" ASC LIMIT [["id", 1], ["LIMIT", 1]]
14:34:50 web.1 | ↳ config/initializers/rails_admin.rb:9
14:34:50 web.1 | Project Load (2.1ms) SELECT "projects".* FROM "projects" WHERE "projects"."id" = ORDER BY "projects"."id" ASC LIMIT [["id", 75], ["LIMIT", 1]]
14:34:50 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Rendering /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/edit.html.haml within layouts/rails_admin/application
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_field.html.haml (3.8ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (31.4ms)
14:34:51 web.1 | Tag Load (0.5ms) SELECT "tags".* FROM "tags" INNER JOIN "projects_tags" ON "tags"."id" = "projects_tags"."tag_id" WHERE "projects_tags"."project_id" = [["project_id", 75]]
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | (0.4ms) SELECT COUNT(*) FROM "tags"
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Tag Load (0.5ms) SELECT "tags".* FROM "tags" ORDER BY tags.id desc
14:34:51 web.1 | ↳ /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_filtering_multiselect.html.haml (22.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_text.html.haml (0.4ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_file_upload.html.haml (13.9ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_multiple_file_upload.html.haml (45.1ms)
14:34:51 web.1 | Rendered /Users/Atua/.rvm/gems/ruby-2.5.1@atua/gems/rails_admin-1.4.2/app/views/rails_admin/main/edit.html.haml within layouts/rails_admin/application (623.9ms)
14:34:51 web.1 | Completed 500 Internal Server Error in 800ms (ActiveRecord: 3.9ms)
14:34:51 web.1 |
14:34:51 web.1 |
14:34:51 web.1 |
14:34:51 web.1 | NoMethodError - undefined method `' for #<Project:0x00007fb7cfa36900>:
14:34:51 web.1 |
rails_admin.rb:
config.model Project do
edit do
field :title
field :headline
field :images, :multiple_carrierwave
end
end
ProjectImageUploader.rb
class ProjectImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
include CarrierWave::ImageOptimizer
process optimize: [{ quality: 85 }]
storage :file
version :normal do
process :efficient_conversion => [640, 960]
end
def store_dir
"system/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
private
def efficient_conversion(width, height)
manipulate! do |img|
img.combine_options do |c|
c.fuzz "3%"
c.trim
c.resize "#{width}x#{height}>"
c.resize "#{width}x#{height}<"
end
img
end
end
end
项目模型:
mount_uploaders :images, ProjectImageUploader
我遇到了同样的问题,将此方法添加到模型中帮助了我:
attr_accessor :delete_images
after_validation do
uploaders = images.delete_if do |uploader|
if Array(delete_images).include?(uploader.file.identifier)
uploader.remove!
true
end
end
write_attribute(:images, uploaders.map { |uploader| uploader.file.identifier })
end
def images=(files)
appended = files.map do |file|
uploader = _mounter(:images).blank_uploader
uploader.cache! file
uploader
end
super(images + appended)
end