我一直在搔痒我的大脑(有点痛苦,不会建议它)试图找到一种方法来解决这个问题,但我无法想出任何真正可行的东西。
这个想法是这样的:我有一个页面,允许您创建一个事件。这个活动可以是婚礼,马拉松或筹款活动。不同的事件需要具有特定于该事件类型的表格,例如婚礼活动需要新娘,新郎,地址,招待会等名称。
我想弄清楚的是如何让他们选择一个事件类型,然后转到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
答案 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进行任何客户端存储(硬编码),因为此设计不允许轻松添加未来事件。