如何解决rails中的“没有将类隐式转换为字符串”?

时间:2019-02-26 04:59:47

标签: ruby-on-rails typeerror

我在补丁中有如下方法:

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

是否有办法解决上述错误,并使两个一致的resource_type保持一致?

谢谢

1 个答案:

答案 0 :(得分:1)

实际上,在第二个代码段中,当您调用applicable_resource_type(self.class.name)时,您还交出了一个String,因为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?
...