ROR:参数数量错误(给定2,应为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

activeadmingem用几个参数(active_admin_configorder(实例化ActiveAdmin::OrderClause类,如您在此处和此处看到的。修复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

我建议您创建一个CustomOrderClause类,该类继承自gem的ActiveAdmin::OrderClause类,并且只覆盖必要的方法。然后,您可以在初始化器中配置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

这意味着无论在哪里初始化它,都将使用两个参数进行初始化,因为它们的构造函数接受这一点。因此,您将不得不更改代码中的initialize方法,以接受两个参数,或者从调用它的任何地方只传递一个参数,这将是乏味的

您不应该覆盖整个类,而应该能够使用Module#prepend来更改您感兴趣的功能,而不必担心实现的其余部分。例如

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 #=> ""就是这种情况

这个类中包含的所有其他功能都将保持不变,您不必担心gem本身的任何更改(除非初始化方法和/或此处分配的属性发生更改(

您可以将此文件放置在config/initializers中。

相关内容

  • 没有找到相关文章

最新更新