I finalmente conseguí que esto funcione con rieles 4.x. Esto se basa en la respuesta de Dmitry/ScotterC, entonces +1 a ellos.
PASO 1. Para empezar, aquí es el modelo completo con la asociación polimórfica:
# 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
Sí, eso no es nada realmente nuevo. Sin embargo, podría preguntarse, ¿de dónde viene polymorph_type
y cómo se establece su valor? Es parte del registro de la base de datos subyacente, ya que las asociaciones polimórficas añaden columnas <association_name>_id
y <association_name>_type
a la tabla. Tal como está, cuando se ejecuta build_associable
, el valor _type
es nil
.
PASO 2. Pase y aceptar el tipo de Niños
Haga que su opinión de la forma enviar el child_type
junto con los datos del formulario típicos, y su controlador deben permitir que en sus fuertes parámetros de verificación.
# 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
Por supuesto, su vista (s) tendrá que manejar los diferentes tipos de modelos que son 'asociables', pero esto demuestra uno.
Espero que esto ayude a alguien por ahí.(¿Por qué necesitas pollos polimórficos de todos modos?)
¿Has visto los rieles sobre formas complejas? http://railscasts.com/episodes/75-complex-forms-part-3 –
Sí, lancé mi propia solución. – dombesz