ruby Rails -构建动态表单的方法[已关闭]

xj3cbfub  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(78)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

上个月关门了。
Improve this question
我正在开发一个Rails应用程序,用户可以在其中“设计”表单。请参见下图:

为此,我有以下模型:

class ProgramPart < ApplicationRecord
  has_many :block_elements, dependent: :destroy

class BlockElement < ApplicationRecord
  belongs_to :program_part

  enum element_types: {
    rich_content: 0,
    textfield: 1,
    textarea: 2
  }

  has_rich_text :content

我不太确定如何向用户呈现动态表单以及使用什么方法。
目前拥有:

<%= form_with [how should my form look when inputs are dynamic?] %>
  <% @program_part.block_elements.each do |block| %>
      
    <% if block.element_type == BlockElement.element_types[:rich_content] %>
      <%= block.content %>
    <% elsif block.element_type == BlockElement.element_types[:textfield]  %>

      <%= block.question %>
      <!-- not sure how this should look -->
      <%= @form_builder.text_field(:answer_value)%>
        
    <% elsif block.element_type == BlockElement.element_types[:textarea]  %>
      <!-- textarea -->
    <% end %>

  <% end %>

<% end %>

有没有人做过类似的事情,或者知道什么好的资源?

jtjikinw

jtjikinw1#

我已经实现了类似的事情与形式可配置的管理员,然后由客户端使用。以下是基本内容:
1.为每个可能的DOM输入配置模板

  1. make a page to create a PageTemplate - PageTemplate是一个抽象对象,它包含了在第一步中配置的输入。
    1.制作一个使用JS填充页面模板的表单-例如,有一个按钮“添加文本字段”,通过按下它,您可以使用JS向表单添加输入。
    1.提交填充的PageTemplate后,您可以为用户呈现它。
    你需要一个抽象Page对象,抽象DOM对象,然后每个DOM元素都有一个对象,如下所示:
class PageTemplate
  has_many :dom_objects
end

class DomObject
  self.table_name = 'dom_objects'
  belongs_to :page_template
  
  def dom_type
    nil
  end
end

class TextField < DomObject
  self.table_name = 'dom_objects'

  def dom_type
    'text_field'
  end
end
class TextArea < DomObject
  self.table_name = 'dom_objects'

  def dom_type
    'text_area'
  end
end

dom_type将告诉您的系统需要呈现什么类型的对象。当然,它也应该存储在数据库中,但它可以帮助你自动填充数据库字段的类型,如果你正在添加一个text_field对象,而不是抽象的东西。正如你所看到的,每个静态dom对象都是从抽象DomObject嵌套而来的,抽象DomObject基本上是所有创建的dom对象的表。你甚至可以添加诸如宽度,高度或其他css类的信息作为dom对象表的参数,使每个创建的dom输入成为一个uniq和高度可定制的实体。

Wrapup

这种方法是面向对象的,并通过设计进行组合。所有你需要做的就是设置每个“砖”,然后用JS动态组装“墙”,它将整齐地存储在DB中。然后从数据库中获取页面对象,并在需要的地方呈现它。
希望能帮上忙!:)

相关问题