Как Вы находите пространство имен/имя модуля программно в Ruby on Rails?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

55
задан Cœur 23 March 2017 в 16:05
поделиться

4 ответа

Это должно сделать это:

  def get_module_name
    @module_name = self.class.to_s.split("::").first
  end
22
ответ дан Daniel Lucraft 26 November 2019 в 17:41
поделиться

Это работало бы, если бы контроллер действительно имел имя модуля, но возвратил бы название контроллера, если это не сделало.

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

можно определить, имеет ли класс имя модуля или не, и возвратите что-то еще кроме имени класса, на которое можно протестировать.

6
ответ дан Steropes 26 November 2019 в 17:41
поделиться

Я не думаю, что существует инструмент для очистки путь, и я видел это где-то в другом месте

class ApplicationController < ActionController::Base
  def get_module_name
    @module_name = self.class.name.split("::").first
  end
end
1
ответ дан 26 November 2019 в 17:41
поделиться

Я знаю, что это старый поток, но я только что столкнулся с необходимостью иметь отдельную навигацию в зависимости от пространства имен контроллера. Решение, которое я придумал, заключалось в следующем в макете моего приложения:

<%= 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

Конечно, эти части должны существовать для каждого пространства имен, иначе возникает ошибка. Теперь навигация для каждого пространства имен будет отображаться для каждого контроллера без необходимости изменять какой-либо контроллер или представление.

2
ответ дан 26 November 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: