ruby 升级到 3.0.0 后 Searchkick 搜索方法参数错误
Searchkick search method argument error after ruby upgrade to 3.0.0
将 ruby 版本从 2.7.2 更新到 3.0.0,默认的 Searchkick 搜索行为停止工作。
错误跟踪:
ArgumentError in ProductsAvailabilitiesController#index
wrong number of arguments (given 2, expected 0..1)
searchkick (4.4.4) lib/searchkick/model.rb:43:in `searchkick_search'
...
这是在 ruby 2.7.2 上运行良好的简单搜索方法:
def search_method(query, page)
search_options = {
fields: [:name, :address, :comment],
match: :word_middle,
page: page,
per_page: 10
}
search(query, search_options)
end
这是我的 Gemfile.lock:
searchkick (4.4.4)
activemodel (>= 5)
elasticsearch (>= 6)
hashie
elasticsearch (7.11.2)
elasticsearch-api (= 7.11.2)
elasticsearch-transport (= 7.11.2)
elasticsearch-api (7.11.2)
multi_json
elasticsearch-transport (7.11.2)
faraday (~> 1)
multi_json
有没有办法解决这个问题,或者它是 gem 来源中的错误?
在 ruby 3.0.0 更新日志中,您将找到有关以下内容的更新:
Changes in separation of positional and keyword arguments
如您在错误跟踪中所见,问题出在方法 searchkick_search
中。
让我们在 searchkick gem 来源中查看它的 implementation。它包含参数 **options:
def searchkick_search(term = "*", **options, &block)
在ruby 2.7.2 中,散列会自动转换为关键字参数。
在 ruby 3.0.0 中没有。
如果您想保留此行为 - 添加“**”到搜索方法参数。
只需将您的来源更改为:
search(query, search_options_hash)
为此:
search(query, **search_options_hash)
将 ruby 版本从 2.7.2 更新到 3.0.0,默认的 Searchkick 搜索行为停止工作。
错误跟踪:
ArgumentError in ProductsAvailabilitiesController#index
wrong number of arguments (given 2, expected 0..1)
searchkick (4.4.4) lib/searchkick/model.rb:43:in `searchkick_search'
...
这是在 ruby 2.7.2 上运行良好的简单搜索方法:
def search_method(query, page)
search_options = {
fields: [:name, :address, :comment],
match: :word_middle,
page: page,
per_page: 10
}
search(query, search_options)
end
这是我的 Gemfile.lock:
searchkick (4.4.4)
activemodel (>= 5)
elasticsearch (>= 6)
hashie
elasticsearch (7.11.2)
elasticsearch-api (= 7.11.2)
elasticsearch-transport (= 7.11.2)
elasticsearch-api (7.11.2)
multi_json
elasticsearch-transport (7.11.2)
faraday (~> 1)
multi_json
有没有办法解决这个问题,或者它是 gem 来源中的错误?
在 ruby 3.0.0 更新日志中,您将找到有关以下内容的更新:
Changes in separation of positional and keyword arguments
如您在错误跟踪中所见,问题出在方法 searchkick_search
中。
让我们在 searchkick gem 来源中查看它的 implementation。它包含参数 **options:
def searchkick_search(term = "*", **options, &block)
在ruby 2.7.2 中,散列会自动转换为关键字参数。 在 ruby 3.0.0 中没有。 如果您想保留此行为 - 添加“**”到搜索方法参数。
只需将您的来源更改为:
search(query, search_options_hash)
为此:
search(query, **search_options_hash)