Как найти путь к модулю Rails для метода - PullRequest
0 голосов
/ 06 февраля 2019

Новое в рубине / рельсах.В большом приложении на Rails я сталкиваюсь с методами и не могу найти для них документацию.Например, есть метод process.Когда я анализирую и изучаю его предков, я могу добраться до Rails::Controller::Testing::TemplateAssertions.process, но поиск в Google, который не дает мне никакой документации о том, как использовать метод, просто определение метода , которое очень неясно.

То, что я хотел найти, было ActionDispatch::Integration::Session.process, которое я затем могу найти в https://api.rubyonrails.org/ и получить подробную документацию о том, как использовать метод.Я думаю, у меня проблемы с поиском этого «оригинального» пути к модулю из-за использования Rails миксинов.Единственный способ, которым я обнаружил это, - просеять файлы и файлы хранилища rails, прежде чем я обнаружил, что это упомянуто в каком-то комментарии.Поэтому у меня вопрос: есть ли более детерминированный способ найти источник метода?

РЕДАКТИРОВАТЬ: контекст этого кода выглядит примерно так:

require 'test_helper'
class C < ActionDispatch::IntegrationTest
   include OtherHelper
   ...
   process(argA,argB,argC)
end

1 Ответ

0 голосов
/ 07 февраля 2019

Есть несколько вещей, которые вы можете использовать, чтобы помочь с самоанализом и отладкой:

  • Установка и требование pry, pry-byebug и размещение binding.pry где-то в коде позволят вамдо step / next через логику, пока вы не доберетесь до того места, где, по вашему мнению, вы должны быть
  • Используя метод owner, как отмечено в комментарии к вашему сообщению.Если у вас есть модель User, вы можете, например, из консоли типа User.method(:_update_callbacks).owner и увидеть, что она из ActiveRecord::Base
  • Вы можете использовать метод .source_location, чтобы увидеть, какой файл что-тоопределено в. Например, с консоли rails я могу набрать User.method(:_update_callbacks).source_location и увидеть, что метод определен в строке 819 файла active_support/callbacks.rb (полный путь указан в ответе)
  • Если вы зналичто модуль был включен, но не смог выяснить, где можно также отредактировать гем в локальной системе, чтобы напечатать, куда он включается

Ниже выводится Bar

module Foo
  def self.included(base)
    puts "including..."
    puts base
    puts "included..."
  end
end

class Bar
  include Foo
end

Возможно, есть что-то лучше / чище, но это может быть полезно.

Более подробно об использовании pry, согласно моему комментарию ниже:

Учитывая, что я запустилgem install pry pry-byebug и получите следующий пример кода:

require 'pry'
require 'pry-byebug'

module Foo
  def blah
    puts "in Foo"
  end
end

class Bar
  include Foo

  def blah
    binding.pry
    super
    puts "in Bar"
  end
end

x = Bar.new
x.blah

Когда вы нажмете binding.pry, перед super, вы можете позвонить next, и вы перейдете в новый файл, в котором выможно увидеть имя файла и номер строки.Вам нужно будет добавить binding.pry в самом файле gem на вашем компьютере.bundle open <gemname> или gem open <gemname> должны открывать фактическую папку в вашем редакторе, и, если вы настроили pry / byebug в вашем Gemfile (если используете bundler) или устанавливаете через gem, она должна работать.

step with pry

...