неопределенный метод def_delegator для Datatable: Class - PullRequest
0 голосов
/ 05 марта 2019

Я создал datatable и пытаюсь использовать link_to и _path helper в моем datatable.rb. Я получаю ошибку "неопределенный метод", когда использую def_delegator. По этой ссылке должно работать. Почему я не могу использовать def_delegator?

datatable.rb:

class NetworkDatatable < AjaxDatatablesRails::ActiveRecord


  def_delegator :@view, :link_to
  def_delegator :@view, :network_path


  def view_columns
    @view_columns ||= {
       network: { source: "Network.network"},
       comment: { source: "Network.comment"}
    }
  end

  def data
    records.map do |record|
      {  
         network: link_to(record.id, "#", network_path(record.id), :onclick => "display_dialog(); return(false);"),
         comment: record.comment
      }
    end
  end

  def get_raw_records
     Network.all
  end

end

ошибка:

Completed 500 Internal Server Error in 9ms (ActiveRecord: 0.0ms)



NoMethodError (undefined method `def_delegator' for NetworkDatatable:Class):

app/datatables/network_datatable.rb:4:in `<class:NetworkDatatable>'
app/datatables/network_datatable.rb:1:in `<top (required)>'

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Возможно, попробуйте следующее

class NetworkDatatable < AjaxDatatablesRails::ActiveRecord
  delegate :link_to, :network_path, to: :@view
end

def_delegator - это метод Forwardable, и я не вижу расширения этого модуля. Хотя вы, очевидно, могли бы расширить свой класс с помощью этого модуля, как предлагали другие.

Однако Module#delegate - это метод rails, добавленный в класс Module (что означает, что он доступен почти в каждом классе) и должен работать в соответствии с предлагаемым.

Обратите внимание, что сигнатуры метода немного отличаются.

Forwardable#def_delegator (стандартная библиотека ruby)

# def_delegator :target, :method

Forwardable#def_delegators множественное число (стандартная рубиновая библиотека)

# def_delegators :target, :method1, :method2, ..., :method_n

Module#delegate (только рельсы)

# delegate :method1, :method2, ..., :method_n, to: :target
2 голосов
/ 05 марта 2019

def_delegator - это метод Переадресация класс

Чтобы использовать его, вам нужно будет сделать следующее:

require 'forwardable'

class NetworkDatatable < AjaxDatatablesRails::ActiveRecord
  extend Forwardable

  def_delegator :@view, :link_to

end
0 голосов
/ 05 марта 2019

Метод def_fowardable определен в стандартной библиотеке Ruby Fowardable, поэтому класс должен расширять модуль, чтобы иметь возможность его использовать. Пример этого метода приведен в разделе Использование помощников вида проекта ajax-datatables-rails.

require 'forwardable'

class NetworkDatatable < AjaxDatatablesRails::ActiveRecord
  extend Fowardable

  def_delegator :@view, :link_to
  def_delegator :@view, :network_path

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...