I wreszcie got to do pracy z Rails 4.x Jest to oparte na odpowiedzi Dmitry/ScotterC, więc daj im +1.
KROK 1. Aby rozpocząć, tutaj jest pełny model z polimorficznych asocjacji:
# 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
Tak, to nic nowego. Jednak możesz się zastanawiać, skąd pochodzi polymorph_type
i jak jest ustawiona jego wartość? Jest to część bazowego rekordu bazy danych, ponieważ skojarzenia polimorficzne dodają do tabeli kolumny <association_name>_id
i. W stanie, w którym jest wykonywany build_associable
, wartość .
KROK 2. przepustkę i zaakceptować typu potomnego
Czy Pana zdaniem forma wysłać child_type
wraz z typowymi danymi formularz, a kontroler musi pozwalać je sprawdzić jego mocne parametry.
# 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
Oczywiście, twój widok (y) będzie musiał obsłużyć różne typy modeli, które są "powiązane", ale to demonstruje.
Mam nadzieję, że to komuś pomaga.(Dlaczego tak czy inaczej potrzebujesz polimorficznych kurczaków?)
Czy widziałeś railscast na temat skomplikowanych formularzy? http://railscasts.com/episodes/75-complex-forms-part-3 –
Tak, przetasowałem własne rozwiązanie. – dombesz