Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Каталог lib - это место, где вы можете разместить модули / классы, которые могут быть смешаны или использованы контроллерами (и чем-то еще). Это может быть место для размещения кода, который не попадает в другие области (но будьте осторожны, чтобы убедиться, что библиотека сама не превращается в беспорядок). Вспомните боковые комментарии:
Если вы знаете, что у вас есть большое количество связанных функций, которые могут или будут использоваться в других приложениях, это может быть плагин.
Также стоит помнить, что нет ничего плохого в создании модели, не являющейся объектом Active Record. Итак, опять же, в зависимости от того, что у вас есть, это тоже может иметь смысл.
Контроллеры должны быть очень минимальными - в основном они перехватывают аргументы и принимают решения на очень высоком уровне. Если у вас есть вспомогательные функции, которые делают именно такие вещи, но не собираются использовать повторно, то сохранение их в контроллере будет правильным решением. Просто не забудьте пометить их как личные.
Для более часто используемых вещей вы можете либо вернуть их в свой ApplicationController (если они используются во всех контроллерах), либо в класс в вашем каталоге app / models. Я рекомендую каталог models, а не lib, потому что Rails в режиме разработки намного лучше обнаруживает изменения в этих файлах и перезагружает их. Изменения файлов в / lib обычно требуют перезапуска веб-сервера, что замедляет ваши усилия по разработке. Это прискорбно, потому что помощники контроллера действительно не следует смешивать с моделями.
В целом, однако, если у вас больше, чем горстка этих помощников, вы, вероятно, слишком много делаете в своих контроллерах. Внимательно посмотрите на них и подумайте, возможно, некоторые из них не должны быть частью ваших моделей.
Создать файл модуля в каталоге lib
:
module ControllerUtil
def foo
end
def bar
end
end
Включить модуль в контроллер:
class UsersController < ApplicationController
include ControllerUtil
end