Paperclip gem Rails [6.1]:迁移错误参数数量错误(给定 3,预期 2)

问题描述 投票:0回答:2

我正在尝试在我的 Rails 应用程序上安装回形针 gem,我连续遇到了 3 个问题,我想向他们指出,这可能与最后一个问题有关:

1-我无法安装回形针依赖项“mimemagic”=>我通过将文件

freedesktop.org.xml.in
及其变量
FREEDESKTOP_MIME_TYPES_PATH
添加到我的Windows计算机来解决它。

2 - 然后在初始化回形针后,我无法进行迁移=>我通过添加我的rails应用程序的版本来解决它,该版本是[6.1] bessid活动记录,所以它变成

class AddAttachmentImageToPics < ActiveRecord::Migration[6.1]

3-我遇到的最后一个问题是当我输入

rails db:migrate
时,我收到一条消息:

ArgumentError: wrong number of arguments (given 3, expected 2)

这是我的迁移文件的内容:

class AddAttachmentImageToPics < ActiveRecord::Migration[6.1]
  def self.up
    change_table :pics do |t|
      t.attachment :image
    end
  end

  def self.down
    remove_attachment :pics, :image
  end
end

cmd 中的消息:

C:\Users\Admin\Desktop\Ruby\instagrameme>rails db:migrate
== 20220205102326 AddAttachmentImageToPics: migrating =========================
-- change_table(:pics)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

wrong number of arguments (given 3, expected 2)
C:/Users/Admin/Desktop/Ruby/instagrameme/db/migrate/20220205102326_add_attachment_image_to_pics.rb:4:in `block in up'
C:/Users/Admin/Desktop/Ruby/instagrameme/db/migrate/20220205102326_add_attachment_image_to_pics.rb:3:in `up'

Caused by:
ArgumentError: wrong number of arguments (given 3, expected 2)
C:/Users/Admin/Desktop/Ruby/instagrameme/db/migrate/20220205102326_add_attachment_image_to_pics.rb:4:in `block in up'
C:/Users/Admin/Desktop/Ruby/instagrameme/db/migrate/20220205102326_add_attachment_image_to_pics.rb:3:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
ruby-on-rails ruby windows version paperclip
2个回答
6
投票

我认为this是您问题的根本原因。在

rails 5
中使用的 column 方法采用了 3 个参数,但在 rails 6 中第三个参数更改为关键字参数。这是
ruby >= 2.7
的一个问题,因为他们删除了哈希值到关键字参数的自动转换。

您可能需要叉子或猴子补丁回形针来解决这个问题。


0
投票

替代方案1

使用 kt-paperclip,它是相同的回形针宝石,但由 https://github.com/kreeti

替代方案2

对于猴子修补,您需要创建两个文件(我真的推荐您),或者如果您想将所有文件保留在同一个文件中,则只需创建一个文件

第一个

config/initializers/paperclip_attachment_patch.rb

module Paperclip
  module Schema
    module TableDefinition
      def attachment(*attachment_names)
        options = attachment_names.extract_options!

        attachment_names.each do |attachment_name|
          COLUMNS.each_pair do |column_name, column_type|
            column_options = options.merge(options[column_name.to_sym] || {})
            column("#{attachment_name}_#{column_name}", column_type, **column_options)
          end
        end
      end
    end
  end
end

还有第二个

config/initializers/paperclip_validators_patch.rb


module Paperclip
  module Validators
    class AttachmentContentTypeValidator < ActiveModel::EachValidator
      def mark_invalid(record, attribute, types)
        record.errors.add attribute, :invalid, **options.merge(types: types.join(', '))
      end

      def validates_attachment_content_type(*attr_names)
        options = _merge_attributes(attr_names)
        validates_with AttachmentContentTypeValidator, **options.dup
        validate_before_processing AttachmentContentTypeValidator, **options.dup
      end
    end
  end
end

正如 @Cameron 上面所说,在

ruby >= 2.7
上删除了哈希到关键字参数的转换,因此为了解决这个问题,您只需使用
**
到哈希参数中,在我们的场景中,我们在
**column_options
 上进行了操作**options

© www.soinside.com 2019 - 2024. All rights reserved.