Rails以表格形式遍历所需的属性

时间:2018-08-17 19:05:24

标签: html ruby-on-rails ruby slim-lang

在我的Ruby on Rails项目中,我有一个名为Node的模块。在该模块中,我具有不同的类,例如playbackifhangup等。例如,它们是使用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 raf.text_area ra时,它会说f.text_area(ra)

有什么建议吗?

1 个答案:

答案 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