Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ROR:参数数量错误(给定2个,预期1个)_Ruby On Rails_Argument Error - Fatal编程技术网

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)