Проблемы с завершением кода в Ruby и Rails в RubyMine - PullRequest
0 голосов
/ 22 октября 2011

По сравнению с завершением кода, с которым я знаком по разработке на C #, обнаружение завершения кода, предлагаемого RubyMine, на удивление неполно.

  1. Когда я пишу класс с некоторыми методами и хочу вызвать их из другого класса,
    почему я получаю список завершения кода, который имеет длину около мили, но без соответствующих методов-предложений?
    (Или это ошибка / фича в моем RubyMine ?!)

  2. Некоторые классы, такие как ActionMailer магически генерируют методы, подобные методам "delivery_ *" (см. Этот пример ) ... Поскольку я не вижу их в завершение кода, откуда мне знать, что они вообще существуют?
    (К сожалению, в настоящий момент я также получаю сообщение об ошибке, что метод deliver_contact не существует ... Поскольку я полностью скопировал этот пример, я задаю себе вопрос, существует ли эта функция до сих пор 8 [)

Есть ли способы решить эти проблемы?

Ответы [ 3 ]

5 голосов
/ 22 октября 2011

Дело не в том, что Ruby не был «разработан» для использования с завершением кода, а в том, что поведение можно добавлять различными способами, в том числе во время выполнения программы. Это делает завершение кода сложным . RubyMine хорошо работает, но только для очевидной или известной функциональности, когда известен тип объекта.

http://apidock.com предоставляет справочные материалы для Ruby, Rails и RSpec. Игра в irb / pry может сильно помочь. Вы всегда можете получить методы для класса / экземпляра, набрав foo.methods в REPL (хотя я почти всегда foo.methods.sort).

Этот список можно отфильтровать, если вы "вроде" знаете, что ищете с помощью find / grep, например,

> "foo".class.instance_methods(false).sort.grep /each/
=> [:each_byte, :each_char, :each_codepoint, :each_line]

В среде Rails запуск rails console (я предпочитаю использовать pry для консоли, YMMV) дает вам доступ к вашей среде, включая предоставление большого количества динамических методов. Обратите внимание, что некоторые методы не существуют до тех пор, пока они не будут вызваны впервые (особенно те, которые относятся к разновидности find_by_foo_and_bar), поэтому некоторые функции могут все еще быть скрытыми.

0 голосов
/ 22 октября 2011

Все методы, которые имеют следующую структуру: delivery_ *, используют философию метапрограммирования.

Вот очень простой пример: Ruby: define_method против def

Вы обнаружите, что многое в рельсах связано с отсутствием методов и философией метапрограммирования.

0 голосов
/ 22 октября 2011

Основная причина возникновения этих проблем заключается в том, что Ruby (onRails) никогда не был предназначен для использования с дополнением кода. Большинство Rubyist кода в текстовом редакторе и очень рады, что им не нужно завершение кода.

В текущей версии Rails методы delivery_ * устарели в пользу стиля MyClass.contact.deliver.

...