我終於得到這個與Rails的4.x的工作這是基於Dmitry/ScotterC的回答,所以給他們+1。
STEP 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
是的,這是沒有什麼新的。但是,您可能會想知道polymorph_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
當然,你的看法(S)將需要處理不同類型的模型是「可關聯」,但是這展示一個。
希望這可以幫助那裏的人。(爲什麼你需要多形雞?)
你見過關於複雜形式的railscast嗎? http://railscasts.com/episodes/75-complex-forms-part-3 – 2010-10-20 00:16:30
是的,我推出了我自己的解決方案。 – dombesz 2010-10-20 07:49:22