ROR:参数数量错误(给定 2,预期 1)
ROR: wrong number of arguments (given 2, expected 1)
关于下面的一段代码
def initialize(clause)
clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column = ||
@op = ||
@order = ||
@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 = ||
@op = ||
@order = ||
@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::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 =
@op =
@order =
@active_admin_config = active_admin_config
@field = [@column, @op].compact.join
end
这意味着无论在哪里初始化它都会用两个参数初始化,因为它们的构造函数接受它。因此,您必须更改代码中的 initialize
方法以接受两个参数或仅从调用它的任何地方传递一个参数,这将是乏味的。
activeadmin
gem 使用几个参数(active_admin_config
和 order
)实例化 ActiveAdmin::OrderClause
class,如您所见here and here。修复 initialize
方法参数。
def initialize(active_admin_config, clause)
# ...
end
您还应该从 to_sql
方法中删除 active_admin_config
参数,因为它是在没有参数的情况下调用的。您可以在 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
class 的 CustomOrderClause
class,并且只覆盖必要的方法。然后,您可以在初始化程序中配置 activeadmin 时使用 config.order_clause = CustomOrderClause
。
而不是覆盖整个 class,您应该能够使用 Module#prepend
来更改您感兴趣的功能,而不必担心其余的实现。例如
module OrderClauseExtension
def initialize(active_admin_config, clause)
super
if field.empty?
clause =~ /^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column =
@op =
@order =
@field = [@column, @op].compact.join
end
end
end
ActiveAdmin::OrderClause.prepend(OrderClauseExtension)
这将首先尝试原始实现,并在 field
属性导致空 String
的情况下使用您的实现作为后备,这将是 [nil,nil].compact.join #=> ""
中的情况
此 class 中包含的所有其余功能将保持不变,您不必担心 gem 本身的任何更改(除非初始化方法 and/or此处分配的属性更改)
您可以将此文件放在 config/initializers
。
关于下面的一段代码
def initialize(clause)
clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column = ||
@op = ||
@order = ||
@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 = ||
@op = ||
@order = ||
@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::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 =
@op =
@order =
@active_admin_config = active_admin_config
@field = [@column, @op].compact.join
end
这意味着无论在哪里初始化它都会用两个参数初始化,因为它们的构造函数接受它。因此,您必须更改代码中的 initialize
方法以接受两个参数或仅从调用它的任何地方传递一个参数,这将是乏味的。
activeadmin
gem 使用几个参数(active_admin_config
和 order
)实例化 ActiveAdmin::OrderClause
class,如您所见here and here。修复 initialize
方法参数。
def initialize(active_admin_config, clause)
# ...
end
您还应该从 to_sql
方法中删除 active_admin_config
参数,因为它是在没有参数的情况下调用的。您可以在 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
class 的 CustomOrderClause
class,并且只覆盖必要的方法。然后,您可以在初始化程序中配置 activeadmin 时使用 config.order_clause = CustomOrderClause
。
而不是覆盖整个 class,您应该能够使用 Module#prepend
来更改您感兴趣的功能,而不必担心其余的实现。例如
module OrderClauseExtension
def initialize(active_admin_config, clause)
super
if field.empty?
clause =~ /^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
@column =
@op =
@order =
@field = [@column, @op].compact.join
end
end
end
ActiveAdmin::OrderClause.prepend(OrderClauseExtension)
这将首先尝试原始实现,并在 field
属性导致空 String
的情况下使用您的实现作为后备,这将是 [nil,nil].compact.join #=> ""
中的情况
此 class 中包含的所有其余功能将保持不变,您不必担心 gem 本身的任何更改(除非初始化方法 and/or此处分配的属性更改)
您可以将此文件放在 config/initializers
。