2015-05-08 81 views
0

我一直在抓我的大腦(有點痛苦,不會建議它)試圖找出一種方法來解決這個問題,但我一直沒有能夠拿出任何看起來可行的事情。Rails:從數據庫生成動態表單

想法是這樣的:我有一個頁面可以讓你創建一個事件。這個事件可能是從婚禮到馬拉松或籌款活動的任何事情。不同的事件需要具有特定於該事件類型的表單,例如,婚禮事件需要新娘,新郎,地址,招待會等的名字

我想弄清楚的是如何讓他們選擇一個事件類型,然後去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 

回答

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 %> 

雖然這可能不適合您的模型如何設置,但單個Even t數據庫可以容納任何事件。如果每個類型都有特定的數據庫,這會更好。

要進入細節,我怎麼會看到這個工作你...你 計劃路線/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 

但是,如果事件是一個父事件數據庫到一個子事件類型,你可能能夠使它工作,雖然我不熟悉Ruby on Rails中的關係數據庫來說如何。

0

這是一個相當常見的模式。在你的編輯/新形式(或模式)上,你需要在你的event_id字段上有一個javascript處理程序。當它發生變化時,您向服務器發出ajax請求以獲取該事件的有效event_types,以便填充event_types輸入控件。

我強烈建議不要做任何event_types的客戶端存儲(硬編碼),因爲此設計不允許輕鬆添加未來事件。