Rails:从数据库生成动态表单

时间:2015-05-08 16:04:41

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

我一直在搔痒我的大脑(有点痛苦,不会建议它)试图找到一种方法来解决这个问题,但我无法想出任何真正可行的东西。

这个想法是这样的:我有一个页面,允许您创建一个事件。这个活动可以是婚礼,马拉松或筹款活动。不同的事件需要具有特定于该事件类型的表格,例如婚礼活动需要新娘,新郎,地址,招待会等名称。

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

我最初的想法是将事件类型存储在数据库中,每个表单都存储为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

2 个答案:

答案 0 :(得分:0)

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

<%= 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中的关系数据库不太熟悉,不知道如何。

答案 1 :(得分:0)

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

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