Как решить "неявное преобразование класса в строку" в рельсах? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть метод в патче, как показано ниже:

def applicable_resource_type(resource_type)
  if resource_type.include?('Student')
    student_setting
  else
    teacher_setting
  end
end

Этот метод вызывается в другом патче, который проверяет, является ли тип ресурса «учитель» или «ученик», и сохраняет логическое значение в «активный».».

def exams
  School.new(resource: self).request if can_examine_students?
end

private

def can_examine_students?
  active = applicable_resource_type(self.class.name).is_active?
  if active && (self.is_a?(Teacher))
      active = belongs_to_school?
  end
  active
end

Однако resource_type передается как String, тогда как в can_examine_students? оно передается как класс / модуль.Есть ли способ сделать их обоих согласованными?

Я попробовал следующее:

def applicable_resource_type(resource_type)
  if resource_type.include?(Student)
    student_setting
  else
    teacher_setting
  end
end

Но выдало ошибку как:

TypeError:
  no implicit conversion of Class into String

Я также попробовал

resource_type.include?('Student'.constantize)

Но он выдал ту же ошибку typerror.

Есть ли способ устранить вышеуказанную ошибку и сохранить согласованность обоих типов ресурсов:

Спасибо

1 Ответ

0 голосов
/ 26 февраля 2019

На самом деле, во втором фрагменте кода при вызове applicable_resource_type(self.class.name) вы также передаете строку, потому что class.name возвращает строку.

Если вы хотите написать первый метод более элегантно, выможно использовать is_a?, который принимает имя класса в качестве аргумента.Это будет выглядеть следующим образом:

def applicable_resource_type(resource_type)
  if resource_type.is_a?(Student)
    ...

Обратите внимание, что вы передаете Student в качестве имени класса.Затем вам нужно также адаптировать второй фрагмент кода и просто передать класс, а не class.name.Следовательно,

def can_examine_students?
  active = applicable_resource_type(self.class).is_active?
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...