Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Это должно сделать это:
def get_module_name
@module_name = self.class.to_s.split("::").first
end
Это работало бы, если бы контроллер действительно имел имя модуля, но возвратил бы название контроллера, если это не сделало.
class ApplicationController < ActionController::Base
def get_module_name
@module_name = self.class.name.split("::").first
end
end
Однако, если мы изменяем это немного на:
class ApplicatioNController < ActionController::Base
def get_module_name
my_class_name = self.class.name
if my_class_name.index("::").nil? then
@module_name = nil
else
@module_name = my_class_name.split("::").first
end
end
end
можно определить, имеет ли класс имя модуля или не, и возвратите что-то еще кроме имени класса, на которое можно протестировать.
Я не думаю, что существует инструмент для очистки путь, и я видел это где-то в другом месте
class ApplicationController < ActionController::Base
def get_module_name
@module_name = self.class.name.split("::").first
end
end
Я знаю, что это старый поток, но я только что столкнулся с необходимостью иметь отдельную навигацию в зависимости от пространства имен контроллера. Решение, которое я придумал, заключалось в следующем в макете моего приложения:
<%= render "#{controller.class.name[/^(\w*)::\w*$/, 1].try(:downcase)}/nav" %>
Что выглядит немного сложным, но в основном выполняет следующие функции - принимает имя класса контроллера, которое может быть, например, «People» для контроллера без пространства имен, и "Admin :: Users" для объекта с пространством имен. Использование строкового метода [] с регулярным выражением, которое возвращает что-либо до двух двоеточий или nil, если ничего нет. Затем он меняет его на нижний регистр («попытка» присутствует в случае отсутствия пространства имен и возвращается nil). Это оставляет нам либо пространство имен, либо ноль. Затем он просто отображает партиал с пространством имен или без него, например без пространства имен:
app/views/_nav.html.erb
или в пространстве имен администратора:
app/views/admin/_nav.html.erb
Конечно, эти части должны существовать для каждого пространства имен, иначе возникает ошибка. Теперь навигация для каждого пространства имен будет отображаться для каждого контроллера без необходимости изменять какой-либо контроллер или представление.