在我的Ruby on Rails项目中,我有一个名为Node的模块。在该模块中,我具有不同的类,例如playback
,if
,hangup
等。例如,它们是使用Node::Playback
创建的。这些类均具有不同的必需属性。节点包含以下声明:
class Node < ActiveRecord::Base
...Other irrelevant code
class << self
attr_accessor :required_attrs
attr_accessor :optional_attrs
def acts_as_node required_attrs=[], optional_attrs=[]
@required_attrs = required_attrs
@optional_attrs = optional_attrs
(required_attrs + optional_attrs).each do |attr|
attr_accessor attr
end
required_attrs.each do |attr|
validates attr, presence: true
end
end
end
end
例如,声明为playback
的{{1}}在其模型中具有以下内容:
class Node::Playback
在用于创建播放节点的视图中,我想遍历所有必需的属性,即class Node::Playback < Node
acts_as_node [ :body, :author ]
end
。动态执行此操作而不是对其进行硬编码非常重要,因为Node具有许多不同的类,而不仅仅是回放。
[:body, :author]
在上面的代码中,当我在控制器中对其进行拖尾时,@ node_type.required_attrs返回= form_for([@callflow, @new_node]) do |f|
h2 | Fill All Required Attributes Below
- @node_type.required_attrs.each do |ra|
.form-group
= f.label ra
= f.text_area(ra)
h2 | Fill Optional Attributes Below
- @node_type.optional_attrs.each do |oa|
.form-group
= f.label oa
/= f.text_area oa
.form-group
= f.submit class: 'btn btn-success'
。我还检查了数组中的元素是否属于“ Symbol”类。 [:body, :author]
是使用@new_node
创建的,而Node.new(callflow: @callflow)
是使用@node_type
创建的
"Node::Playback".constantize
将在我的视图中放置正确的标签(即,当我注释掉其下方的行时,在我的表单中正确放置一个标签)。
但是,当我执行f.label ra
或f.text_area ra
时,它会说f.text_area(ra)
有什么建议吗?
答案 0 :(得分:0)
@new_node
似乎是Node
的一个实例。我没有看到@node_type
的定义,但是基于错误,我假设它是一个Node::Playback
实例。
Node
实例将不具有Node::Playback
的必需属性,因此当您要求表单渲染器f
(代表Node
实例)来渲染ra
实例的必需属性Node::Playback
,您会收到错误消息。
尝试以下方法:
= form_for([@callflow, @new_node]) do |f|
h2 | Fill All Required Attributes Below
- f.object.required_attrs.each do |ra|
.form-group
= f.label ra
= f.text_area(ra)
然后确保@new_node
实例具有适当的类型(例如Node::Playback
)