我可以使用类似于String#constantize的东西来初始化Hyperstack :: Component吗?

时间:2019-08-03 22:02:16

标签: ruby-on-rails ruby reactjs isomorphic hyperstack

我的数据库中有一些对象,我想使用专用的Hyperstack视图组件进行渲染。 假设我的对象从A到J具有唯一的name属性。现在,我想用each遍历它们,并渲染ComponentAComponentB,{{1 }},...取决于我对象的ComponentC,然后将我的对象作为参数传递给组件。

我现在要做的是:

name

我想做的事情是这样的:

DB_Objects.each do |object|
  if    object.name == 'A'
    ComponentA(data: object)
  elsif object.name == 'B'
    ComponentB(data: object)
  elsif object.name == 'C'
    ComponentC(data: object)
  elsif ...

这是伪代码,因为您不能给变量提供常量。 但这显示了我想做的事。

如何防止将对象手动映射到其视图。

2 个答案:

答案 0 :(得分:2)

从未使用过HyperStack,但这应该给您正确的想法。

datafeed_test (datetime, trantype, amountreal)

您可以class Thing < ApplicationRecord OBJECT_TYPES = { 'A': 'CommponentA' }.freeze def to_component @to_component ||= OBJECT_TYPES[self.name].constantize.new(self) end end ,但我发现当其他开发人员加入项目时,这会使他们感到困惑。

请紧记"Component#{self.name}".constantize.new(self)将返回实际的常量,而不仅仅是返回已常量化的字符串(驼峰式以及您所拥有的),因此您可以调用String#constantize#new或任何您想要的东西在上面。

答案 1 :(得分:0)

每个组件类都定义一个与该类同名的方法。例如,当您说

ComponentA(data: object)

您正在调用与ComponentA类绑定的名为ComponentA的方法。

要动态引用组件,您可以使用send方法:

send('Component' + object.name, data: object)

或者,每个组件类都有一个类方法insert_element,它将渲染该组件类的一个实例,并将其插入到渲染缓冲区中。例如:

('Component' + object.name).constantize.insert_element(data: object)

我提出这个建议是因为它虽然更长,但您可以用它来概括您的想法(我认为这很酷)

class ApplicationRecord < ActiveRecord::Base
  def render(opts = {})
    ('Component' + object.name).constantize.insert_element(opts, data: object)
  end
end

现在你可以说

some_record.render

当然,要概括这样,您可能要使用name以外的其他名称。无论如何,您真的可以从中获得乐趣!

相关问题