2012-09-04 89 views
0

我使用的命名空間的模型來分配不同類型的服務平臺:部隊命名空間模型形成使用根類名

關係:Platform has_many :services & Service belongs_to :platform

繼承:Service::Service1 < ServiceService::Service2 < Service

每種服務類型都有一組不同的字段(我使用的是Mongoid,所以字段聲明爲模型,「子模型」類型存儲在_type字段中)。

ServicesController::new,我實例化新的服務是這樣的:

def new 
    klass = "service/#{params[:type]}" 
    @service = klass.camelize.constantize.new 
    render :form 
end 

params[:type]由路由參數(像/:platform_id/services/new/:type

在我form視圖給出,我現在可以顯示視場服務類型(它是Haml + simple_form):

= simple_form_for @service do |f| 

[...] 

    - case @service.class 

    - when Service::Service1 
    = f.input :field1 

[...] 

一切工作正常,直到n流:生成的HTML的輸入是這樣的:

<input class="string required" id="service_service1_field1" name="service_service1[field1]" size="50" type="text"> 

隨着service_service1[field1]爲字段名,我的PARAMS哈希將包含根據子業務不同的密鑰,並在我的控制器的create行動,我會寫一case /當每個子服務,而service[field1]將「幹」我的代碼(我只需要添加一個隱藏的領域與確切的模型實例)。

有沒有辦法強制Rails在使用名稱空間模型時使用根類作爲字段名?

編輯:對提交按鈕國際化同樣的問題:Rails將用於helpers.submit.service_service1.create,我想它尋找helpers.submit.service.create作爲文本是所有服務相同。

+0

'simple_form_for摘自:service'似乎工作。我認爲這是不可能的,因爲根'Service'類沒有'Service1'字段。我必須做更多的測試來驗證沒有副作用(表單會在驗證錯誤上獲取字段值?等等) –

+0

第一個副作用:通過使用符號而不是對象,表單構建器不知道是否它是一個創建或更新操作:在編輯時不添加ID隱藏字段,I18n查找'submit'而不是'create'或'update',驗證錯誤不提供帶有提交值的字段等。最後不是解決方案。 –

回答

1

您是否試過:as選項?我已經將這個用於子類,但不用於名稱空間。您可能需要使用:url選項進行一些額外的體操操作,才能將表單發佈到正確的位置。

If you have an object that needs to be represented as a different parameter, 
like a Person that acts as a Client: 

<%= form_for(@person, :as => :client) do |f| %> 
    ... 
<% end %> 

Rails docs

+0

該死的,我在文檔上花了一個小時而沒有看到這個! (我正在尋找類似於:model或:class等)。現在我看到有一個關於':as'的大段落......非常感謝,它的作用像一個魅力! –

相關問題