【问题标题】:Rails: Dynamic form generation from the databaseRails:从数据库生成动态表单
【发布时间】:2015-05-08 16:04:41
【问题描述】:

我一直在绞尽脑汁(有点痛苦,不建议这样做)试图找出一种方法来解决这个问题,但我一直无法想出任何真正可行的方法。

这个想法是这样的:我有一个页面可以让你创建一个事件。这个活动可以是从婚礼到马拉松或筹款活动的任何活动。不同的事件需要具有特定于该事件类型的表单,例如婚礼活动需要新娘的姓名、新郎、地址、招待会等。

我想弄清楚的是如何允许他们选择事件类型,然后转到 localhost:3000/events/create(/:event_type) 并在正确的表单字段中加载该视图。

我最初的想法是将事件类型存储在数据库中,每个表单都存储为 JSON,但这似乎比我认为的必要复杂。

有什么想法吗?

到目前为止,这是 routes.rb:

  get 'my_events/', to: 'events#index', as: :events
  get 'events/create', to: 'events#create', as: :new_event
  match 'events/new', to: 'events#new', as: :post_new_event, via: :post
  get 'event/:slug', to: 'events#show', as: :show_event

  root 'static#index'

  devise_for :users, :controllers => { :omniauth_callbacks => 'omniauth_callbacks' }

还有事件控制器:

class EventsController < ApplicationController

  def index
    @events = Event.all()
  end

  def create
    @event = Event.new()
  end

  def show
    @event = Event.find_by slug: params[:slug]
  end

  def delete

  end

end

【问题讨论】:

    标签: javascript jquery ruby-on-rails forms activerecord


    【解决方案1】:

    您可以生成带有标签的表单以匹配任意数量的列,而无需知道这样的列名

    <%= form_for @event do |f| %>
      <% @event.attributes.each do |k,v| %>
        <% unless k == 'id' %> #in the case of an edit form, the id should not be changable
          <p>
          <%= f.label k.to_sym %><br> #get the name of the column, put it into a symbol
          <%= f.text_field k.to_sym %> #same as above, will put the matching value in if it exists
          </p>
        <% end %>
      <% end %>
      <%= f.submit %>
    <% end %>
    

    虽然这可能不适合您的模型的设置方式,但可以保存任何事件的单个事件数据库。如果您为每种类型都有一个特定的数据库,这会更好。

    要详细了解我如何看待这对您有用... 您计划的路线/events/create/:event_type 可以工作

    在控制器中的新操作中

    def new
      if params[:event_type] == 'wedding'
        @event = Wedding.new #would need to do the same for each event type
      end                    #a model/database for each different type of event
    end
    

    但是,如果 event 是子事件类型的父事件数据库,您也许可以使其工作,尽管我对 Ruby on Rails 中的关系数据库不够熟悉,无法说明如何操作。

    【讨论】:

      【解决方案2】:

      这是一种相当常见的模式。在您的编辑/新表单(或模式)上,您需要在 event_id 字段上有一个 javascript 处理程序。当它发生变化时,您向服务器发出 ajax 请求以获取该事件的有效 event_types,以便您可以填充 event_types 输入控件。

      我强烈反对对 event_types 进行任何客户端存​​储(硬编码),因为这种设计不允许轻松添加未来的事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        相关资源
        最近更新 更多