Ruby on rails 定义表单中的继承类型

Ruby on rails 定义表单中的继承类型,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我喜欢定义mongoid对象的类型(:type),该对象直接从表单继承 定义和对象的类型非常简单: shapes.build({ x: 0, y: 0 }, Circle) 但现在我想知道是否有可能通过在表单中使用参数自动构建这样一个对象。大概是这样的: <%= form_for :shapes do |s| %> <%= s.text_field(:x) %> <%= s.text_field(:y) %> <%= t.hid

我喜欢定义mongoid对象的类型(:type),该对象直接从表单继承

定义和对象的类型非常简单:

shapes.build({ x: 0, y: 0 }, Circle)
但现在我想知道是否有可能通过在表单中使用参数自动构建这样一个对象。大概是这样的:

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

在隐藏字段中定义_类型值似乎是不可能的。有什么想法吗?

试试下面的方法

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

model.new(params[:shapes])
第一位接受字符串并将其转换为实际类,因此“Circle”变成Circle,如果您理解我的意思的话。下一部分对实际类而不是该类的父类调用new。这样就可以设置正确的类型


为什么看起来不可能?它只是无法设置_type参数。似乎是受保护的或什么的。您是否将其定义为可访问的
attr\u
?如果不能直接设置,您还应该能够通过助手处理它。将
attr\u accessible
定义为
:type
,而不是
:\u type
。修正了这一点,它现在只定义了_类型,如果我从它构建一个新实例,它不会以应该的方式处理它。它不断获取主实例,而不是刚刚定义的那种类型的对象。这离它更近了一步。我现在可以用
constantize
定义实例的:\类型,但它仍然像处理主对象一样处理它。实际代码与我给出的示例不同。在我的实际问题中,我有一组嵌入的对象,因此嵌入了表单,我希望我不必分解整个参数树。有什么想法吗?我不能这样做吗:
model = params[:shapes][:_type].to_s.classify.constantize

model.new(params[:shapes])