I enfin J'ai réussi à faire fonctionner cette fonctionnalité avec Rails 4.x. Ceci est basé sur la réponse de Dmitry/ScotterC, donc +1 à eux.
ÉTAPE 1. Pour commencer, voici le modèle complet avec association polymorphe :
# 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
Oui, ce n'est pas vraiment nouveau. Cependant, vous pourriez vous demander, où se trouve polymorph_type
provient-il et comment sa valeur est-elle fixée ? Elle fait partie de l'enregistrement de la base de données sous-jacente, puisque les associations polymorphes ajoutent une valeur à l'enregistrement. <association_name>_id
y <association_name>_type
colonnes dans le tableau. En l'état actuel des choses, lorsque build_associable
s'exécute, le _type
La valeur de l'article est nil
.
ÉTAPE 2. Passez et acceptez le type d'enfant
Faites en sorte que votre vue de formulaire envoie le child_type
avec les données de formulaire habituelles, et votre contrôleur doit l'autoriser dans sa vérification des paramètres forts.
# 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
Bien sûr, votre ou vos vues devront gérer les différents types de modèles qui sont "associables", mais ceci en démontre un.
J'espère que cela aidera quelqu'un d'autre. (Pourquoi avez-vous besoin de poulets polymorphes de toute façon ?)