2013-04-09 132 views
0

我喜歡直接從表單中定義具有繼承性的mongoid對象的類型(:_type)。定義表單中的繼承類型

定義的類型和對象是相當simpel:

shapes.build({ x: 0, y: 0 }, Circle) 

但現在我想知道是否有可能通過的形式使用PARAMS自動建立這樣一個對象。事情是這樣的:

<%= form_for :shapes do |s| %> 
    <%= s.text_field(:x) %> 
    <%= s.text_field(:y) %> 
    <%= t.hidden_field(:_type, value: "Circle") %> 
<% end %> 

然後使用類似:

Shapes.new(params[:shapes]) 

在一個隱藏字段定義_type價值似乎是不可能的。有任何想法嗎?

+0

爲什麼看起來不可能? – 2013-04-09 20:03:48

+0

它只是不會設置_type參數。似乎受保護或什麼的。 – Tim 2013-04-09 20:07:24

+0

你把它定義爲'attr_accessible'嗎?如果無法直接設置,您還應該能夠通過助手處理它。 – 2013-04-09 20:08:51

回答

0

嘗試像下面

model = params[:shapes][:_type].to_s.classify.constantize 

model.new(params[:shapes]) 

第一位採用字符串並將其轉換爲實際類,所以「圓」變圓,如果你得到我的意思。下一部分將在實際的類中調用new,而不是該類的父類。這樣就設置了正確的類型。

The docs for constantize

+0

這更接近它。我現在可以用'constantize'定義實例的_type,但它仍然像處理它的主要對象那樣處理它。實際的代碼與我給出的例子不同。在我的實際問題中,我有一組嵌入式對象,因此嵌入了表單,我跳了起來,不必分解整個params樹。有關於此的任何想法?我不能這樣做:'<%= form_for:shapes(_type:'Circle')do | s | %>' – Tim 2013-04-10 07:42:17