簡體   English   中英

ROR:arguments 的編號錯誤(給定 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 = $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_configorder )實例化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM