首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >神社衍生品插件方法:image_derivatives!数组的未定义方法'bytesize‘出错

神社衍生品插件方法:image_derivatives!数组的未定义方法'bytesize‘出错
EN

Stack Overflow用户
提问于 2020-08-04 06:02:12
回答 1查看 369关注 0票数 0

感谢您的帮助!

我正在尝试为在Rails控制器操作中上传的图像创建衍生工具。

首先,我用自制软件安装了imagemagickvips

代码语言:javascript
复制
brew install imagemagick
brew install vips

我的Gemfile中有以下内容:

代码语言:javascript
复制
gem 'shrine', '~> 3.0'
gem 'image_processing', '~> 1.8'
gem "aws-sdk-s3", "~> 1.14"

app/uploaders/image_uploader.rb中,我有:

代码语言:javascript
复制
require "image_processing/mini_magick"
 
class ImageUploader < Shrine

    plugin :cached_attachment_data
    plugin :determine_mime_type
    # plugin :remove_attachment
    plugin :validation
    plugin :validation_helpers
    plugin :derivatives

    Attacher.validate do
        validate_max_size 100.megabytes, message: 'Attachment is too large'
        validate_mime_type_inclusion [ 'image/jpg', 'image/jpeg', 'image/png', 'image/gif' ]
    end

    Attacher.derivatives_processor do |original|
        magick = ImageProcessing::MiniMagick.source(original)

        {
            large:  magick.resize_to_limit!(800, 800),
            medium: magick.resize_to_limit!(500, 500),
            small:  magick.resize_to_limit!(300, 300),
        }
    end

end

app/config/initializers/shrine.rb中,我有:

代码语言:javascript
复制
require 'shrine'
require 'shrine/storage/s3'

Shrine.plugin :activerecord

s3_options = {
    bucket: Figaro.env.S3_BUCKET,
    region: Figaro.env.S3_REGION,
    access_key_id: Figaro.env.S3_KEY,
    secret_access_key: Figaro.env.S3_SECRET
}

Shrine.storages = {
    cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options),
    store: Shrine::Storage::S3.new(s3_options)
}

在我的控制器中,我有:

代码语言:javascript
复制
  def create
    handle_money
    @product = Product.new(product_params)
    respond_to do |format|

      if @product.save
        @product.photo.image_derivatives!
        format.html { redirect_to purchases_products_path, notice: 'Product was successfully created.' }
      else
        @photo = @product.build_photo
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

我的模型包括神社图像附件和设置关联:

代码语言:javascript
复制
class Photo < ApplicationRecord
    include ImageUploader::Attachment(:image)
    belongs_to :product
end
代码语言:javascript
复制
class Product < ApplicationRecord
    monetize :price_cents
    has_many :orders, dependent: :destroy
    has_one :photo, dependent: :destroy

    accepts_nested_attributes_for :photo
end

我的Rails表单是:

代码语言:javascript
复制
<%= form_for product, multipart: true do |f| %>
  <% if f.errors.any? %>
    <%= render partial: 'shared/flash_message', locals: { alert_type: 'danger', msg: f.object.errors.full_messages.to_sentence } %>
  <% end %>

  <div class="form-group">
    <%= f.label :name %>
    <%= f.text_field :name, value: f.object.name&.humanize || nil, required: true, class: 'form-control' %>
  </div>

  <div class="form-group">
    <%= f.label :price %>
    <%= f.text_field :price, value: f.object.price || nil, required: true, class: 'form-control' %>
  </div>

  <%= f.fields_for :photo do |photo| %>
    <div class='form-group'>
      <%= photo.hidden_field :image, value: photo.object.cached_image_data %>
      <div class='input-group'>
        <div class='custom-file'>
          <%= photo.file_field :image, class: 'custom-file-input' %>
          <label class='custom-file-label' for='inputGroupFile04'>Choose File</label>
        </div>
      </div>
    </div>
  <% end %>

  <div class="actions d-flex align-items-baseline justify-content-between">
    <%= link_to "Back", purchases_products_path(), class: "btn btn-secondary p-2" %>
    <%= form.submit "Submit", class: "btn btn-primary p-2" %>
  </div>
<% end %>

我的错误发生在控制器中的行:

代码语言:javascript
复制
@product.photo.image_derivatives!

日志显示如下:

代码语言:javascript
复制
NoMethodError - undefined method `bytesize' for #<Array:0x00007ffc826ce518>:
  app/controllers/products_controller.rb:37:in `block in create'
  app/controllers/products_controller.rb:32:in `create'

这个错误可能是由imagemagick和vips库导致的,但是我不确定如何进一步追踪这个错误。

上传不需要使用派生插件(以及相关的后续代码)。

我想知道这个错误的解决方案(清楚地),以及跟踪这些错误的更好的方法(在gem‘pry’之外)。再次感谢您的帮助!

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 06:31:12

这对我很有帮助:

https://github.com/shrinerb/shrine/issues/492

我直接从github repo中使用了最新版本。

删除Shrine的当前版本,并将此行添加到Gemfile:

gem 'shrine', github: 'shrinerb/shrine'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63237527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档