我在补丁中有如下方法:
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保持一致?
谢谢
答案 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?
...