我终于让它与 Rails 4.x 一起工作。这是基于 Dmitry/ScotterC 的回答,所以对他们 +1。
步骤 1.首先,这是具有多态关联的完整模型:
# app/models/polymorph.rb
class Polymorph < ActiveRecord::Base
belongs_to :associable, polymorphic: true
accepts_nested_attributes_for :associable
def build_associable(params)
self.associable = associable_type.constantize.new(params)
end
end
# For the sake of example:
# app/models/chicken.rb
class Chicken < ActiveRecord::Base
has_many: :polymorphs, as: :associable
end
是的,这并不是什么新鲜事。但是您可能想知道,doespolymorph_type
来自哪里以及它的值是如何设置的?它是基础数据库记录的一部分,因为多态关联将列添加<association_name>_id
到<association_name>_type
表中。就目前而言,build_associable
执行时,_type
的值为nil
.
STEP 2. 传入并接受子类型
让您的表单视图child_type
与典型的表单数据一起发送,并且您的控制器必须在其强大的参数检查中允许它。
# app/views/polymorph/_form.html.erb
<%= form_for(@polymorph) do |form| %>
# Pass in the child_type - This one has been turned into a chicken!
<%= form.hidden_field(:polymorph_type, value: 'Chicken' %>
...
# Form values for Chicken
<%= form.fields_for(:chicken) do |chicken_form| %>
<%= chicken_form.text_field(:hunger_level) %>
<%= chicken_form.text_field(:poop_level) %>
...etc...
<% end %>
<% end %>
# app/controllers/polymorph_controllers.erb
...
private
def polymorph_params
params.require(:polymorph).permit(:id, :polymorph_id, :polymorph_type)
end
当然,您的视图将需要处理“可关联”的不同类型的模型,但这展示了一个。
希望这可以帮助那里的人。(为什么你还需要多态鸡?)