Ruby on rails ROR:参数数量错误(给定2个,预期1个)
在下面的代码中Ruby on rails ROR:参数数量错误(给定2个,预期1个),ruby-on-rails,argument-error,Ruby On Rails,Argument Error,在下面的代码中 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
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::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方法,以接受两个参数,或者从调用它的任何位置只传递一个参数,这将是一件非常繁琐的事情。activeadmin gem使用两个参数active\u admin\u config和order实例化activeadmin::OrderClause类,如您所见和所示。修复初始化方法参数
def initializeActivity_admin_config,子句
...
终止
您还应该从to_sql方法中删除活动的_admin_config参数,因为它是在没有参数的情况下调用的。您可以在initialize方法中设置@active_admin_config,并将:active_admin_config添加到attr_reader调用中,以便在to_sql方法中使用
我建议您创建一个CustomOrderClause类,该类继承自gem的ActiveAdmin::OrderClause类,并且只覆盖必要的方法。然后,在初始值设定项中配置activeadmin时,您可以使用config.order\u子句=CustomOrderClause。而不是覆盖整个类,您应该能够使用它来更改您想要更改的功能,而不必担心实现的其余部分。e、 g
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属性产生空字符串时使用您的实现作为回退,在[nil,nil].compact.join=>
该类中包含的所有其他功能将保持不变,并且您不必担心gem本身的任何更改,除非在此处指定的initialize方法和/或属性发生更改
您可以将此文件放在config/initializers中。如何创建该类的新实例?@SebastianPalma我已经添加了代码。您可以看一看。文件config/initializers/order_clause.rb第5行中有什么?还是您刚才添加的那个?@SebastianPalma它指向第5行,这是def initialize,因为您必须查看该类的实例化位置,正如我在您的问题中看到的,没有关于该类的信息。很抱歉沟通错误。实际错误是给定0的参数数目错误,在def to_sqlactive_admin处应为1_config@User刚刚更新了我的答案。非常感谢你的帮助@用户:不客气。我还更新了关于如何自定义order子句的答案。
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)