Помощники в рельсах

Я только начинаю работать в Rails, и мне многое еще нужно узнать, поэтому я, скорее всего, буду в Stackoverflow чаще, чем обычно, задавая вопросы Rails/Ruby для начинающих.

Я просто пытаюсь выяснить, как работают помощники в Rails. Из того, что я видел до сих пор, помощники предназначены для использования с представлениями и не столько с вашими контроллерами.

Однако я хотел бы сделать простую функцию, которая будет проверять ввод пользователя, заданный в параметрах (проверьте, определены ли определенные параметры и, при необходимости, проверьте, действительно ли их значение).

Может ли кто-нибудь объяснить мне, что было бы лучшим способом реализации этого? (Помня, что я хочу использовать это во многих разных контроллерах, чтобы он был доступен по всему миру.)

Я также заметил, что по умолчанию Rails не создает папку lib в основной папке приложения. Разве разработчики размещают свои библиотеки вне папки приложения в основной папке или Rails используют библиотеки по-разному?

Ответ 1

Что касается вашей проверки, это зависит от того, что вы проверяете.

Если данные составляют объекты из вашего проблемного домена, также известные как модели, тогда вы должны использовать встроенные валидаторы из ActiveModel. Вероятно, это то, что вы должны делать, но трудно сказать, не зная точной проблемы. См. Rails Guides on Validations. Вы можете сказать, если это так, спросив себя, будут ли данные, которые требуют проверки, будут сохранены после их получения. Если это так, то это, безусловно, модель. Примером такого типа данных может быть заголовок и текстовые поля сообщения блога, отправляемого в Rails из формы браузера.

Если данные являются чем-то третичным по отношению к вашим моделям или специфичны для презентации, тогда вы должны быть в порядке с помощью помощников. Вы заметили, что помощники используются в основном в представлениях, и хотя это правда, вы ничего не мешаете использовать их в контроллерах, вам просто нужно объявить, что вы будете использовать их с помощью метода ActiveController#helper. Внутри класса ApplicationController много разработчиков установят helper :all, чтобы просто включить все помощники во все контроллеры. Как только код понадобится один раз, на самом деле это не сильно повлияет на производительность.

Отметим, что почти все входящие данные могут быть смоделированы с использованием модели. Большая школа мысли в мире Rails подписывается на идею Fat Model. Люди говорят, что, ставя как можно больше кода в модель, и как мало в контроллере, насколько это возможно, отделяет заботы должным образом и приводит к более удобному коду. Это говорит о том, что даже если вы не считаете, что входящие данные моделируются (в том смысле, что вы можете создать модель для ее представления), вы должны попытаться сделать ее моделью и инкапсулировать логику вокруг ее проверки. Однако вы можете обнаружить, что выполнение вспомогательной функции выполняется быстрее, и либо будет работать.

Ваше понимание правильности ввода данных является хорошим. Я чувствую, что, поскольку вы новичок в Rails, вы привыкли делать это сами, но это не совсем применимо здесь. В мире Rails многие общие вещи, такие как проверки, обрабатываются инфраструктурой. Вам не нужно проверять наличие в массиве params, вместо этого вы вызываете validates_presence_of в модели и позволяете Rails выплевывать ошибку пользователю. Это облегчает работу в долгосрочной перспективе, если вы позволите структуре сделать то, для чего она предназначена.

Что касается вашего вопроса о папке lib, это не имеет большого значения. Вы можете разместить разные файлы поддержки и библиотеки в папке lib в корневом каталоге, и они будут доступны для использования в вашем приложении (файлы в папке app). Вы также можете абстрагировать свой код в плагине или драгоценном камне и включать его таким образом, что многие люди предпочитают делать. Мое предложение для этого состояло бы в том, чтобы прочитать идею о драгоценных камнях и плагинах перед погружением.

Ответ 2

Хотите, чтобы вы захотели, это, вероятно, пользовательский валидатор (в Rails3):

http://railscasts.com/episodes/211-validations-in-rails-3

Вы можете добавить библиотеки lib в создаваемую папку lib или добавить их в config/initializers в добавляемом файле. Файлы в каталоге initializers автоматически загружаются с помощью Rails.