![](/img/trans.png)
[英]How to fix ArgumentError: wrong number of arguments (given 0, expected 1) - RoR
[英]ROR: wrong number of arguments (given 2, expected 1)
在下面的一段代碼上
def initialize(clause)
clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column = $1 || $4
@op = $2 || $5
@order = $3 || $6
@field = [@column, @op].compact.join
end
我收到以下錯誤
ArgumentError (wrong number of arguments (given 2, expected 1)):
config/initializers/order_clause.rb:5:in `initialize'
有誰知道如何解決它? 請幫忙!
編輯- 我正在添加完整的代碼以進行更多說明。
module ActiveAdmin
class OrderClause
attr_reader :field, :order
def initialize(clause)
clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column = $1 || $4
@op = $2 || $5
@order = $3 || $6
@field = [@column, @op].compact.join
end
def valid?
@field.present? && @order.present?
end
def to_sql(active_admin_config)
table = column_in_table?(active_admin_config.resource_column_names, @column) ? active_admin_config.resource_table_name : nil
if json_column?(@column)
table_column = (@column =~ /\./) ? @column : [table, @column].compact.join(".")
['(', table_column, @op, ' ',')::numeric ', @order].compact.join
else
table_column = (@column =~ /\./) ? @column : [table, active_admin_config.resource_quoted_column_name(@column)].compact.join(".")
[table_column, @op, ' ', @order].compact.join
end
end
private
def json_column?(column)
column.include?('->>')
end
def column_in_table?(names, column)
column = json_column?(column) ? column.split('->>')[0].strip : column
names.include?(column)
end
end
end
如您在此處和此處所見, activeadmin
gem 使用幾個 arguments( active_admin_config
和order
)實例化ActiveAdmin::OrderClause
class。 修復initialize
方法 arguments。
def initialize(active_admin_config, clause)
# ...
end
您還應該從to_sql
方法中刪除active_admin_config
參數,因為它是在沒有 arguments 的情況下調用的。 您可以在initialize
方法中設置@active_admin_config
並將:active_admin_config
添加到attr_reader
調用以在to_sql
方法中使用。
module ActiveAdmin
class OrderClause
attr_reader :field, :order, :active_admin_config
def initialize(active_admin_config, clause)
@active_admin_config = active_admin_config
# rest of the code
end
def to_sql
# ...
end
end
end
我建議您創建一個繼承自 gem 的ActiveAdmin::OrderClause
CustomOrderClause
的 CustomOrderClause class 並僅覆蓋必要的方法。 然后,您可以在初始化程序中配置 activeadmin 時使用config.order_clause = CustomOrderClause
。
我認為您正在嘗試覆蓋ActiveAdmin::OrderClause
,如果您看到 ActivAdmin 的代碼,您會發現:
module ActiveAdmin
class OrderClause
attr_reader :field, :order, :active_admin_config
def initialize(active_admin_config, clause)
clause =~ /^([\w\.]+)(->'\w+')?_(desc|asc)$/
@column = $1
@op = $2
@order = $3
@active_admin_config = active_admin_config
@field = [@column, @op].compact.join
end
這意味着無論在哪里初始化它都會用兩個 arguments 進行初始化,因為它們的構造函數接受它。 因此,您必須更改代碼中的initialize
方法以接受兩個 arguments 或僅從調用它的任何位置傳遞一個參數,這將是乏味的。
而不是覆蓋整個 class 您應該能夠使用Module#prepend
來更改您有興趣更改的功能,而不必擔心實現的 rest。 例如
module OrderClauseExtension
def initialize(active_admin_config, clause)
super
if field.empty?
clause =~ /^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column = $1
@op = $2
@order = $3
@field = [@column, @op].compact.join
end
end
end
ActiveAdmin::OrderClause.prepend(OrderClauseExtension)
這將首先嘗試原始實現,並在field
屬性導致空String
的情況下使用您的實現作為后備,這將是[nil,nil].compact.join #=> ""
中的情況
此 class 中包含的功能的所有 rest 將保持不變,您不必擔心 gem 本身的任何更改(除非初始化方法和/或此處分配的屬性發生更改)
您可以將此文件放在config/initializers
中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.