Estoy aprendiendo RoR y tratando de usar accepts_nested_attributes_for y has_and_belongs_to_ many para enviar información que tradicionalmente sería de dos formas. He leído en algunos sitios que son compatibles, algunos sitios no son compatibles y algunos sitios no lo saben. Como referencia, estoy usando Rails 2.3.4. He intentado modelar mi solución del tutorial Recortes del Ryan en nested modelsIntentando usar accepts_nested_attributes_for y has_and_belongs_to_many pero la tabla de unión no se está completando
Por lo que he tratado de depuración, parece que tengo dos problemas, pero no estoy seguro de por qué.
- Cuando envío un formulario con modelos anidados, solo se publica una parte de la información del modelo anidado. Solo obtengo el primer campo, no la "n" que el usuario puede haber seleccionado
- Del único campo que se publica, no hay filas insertadas en la tabla de unión que creé para la relación HABTM.
Aquí es una pieza de código y los registros correspondientes para mi intento de inserción:
Fiscal Modelo:
class Attorney < ActiveRecord::Base
has_and_belongs_to_many :associations
accepts_nested_attributes_for :associations, :reject_if => proc { |a| a['name'].blank? }
end
Asociación Modelo:
class Association < ActiveRecord::Base
has_and_belongs_to_many :attorneys
accepts_nested_attributes_for :attorneys
validates_presence_of :name, :message => "Please enter an association name."
end
Controlador de abogados:
def new
@attorney = Attorney.new
@attorney.associations.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @attorney }
end
end
def create
@attorney = Attorney.new(params[:attorney])
respond_to do |format|
if @attorney.save
flash[:notice] = 'Attorney was successfully created.'
format.html { redirect_to(@attorney) }
format.xml { render :xml => @attorney, :status => :created, :location => @attorney }
else
format.html { render :action => "new" }
format.xml { render :xml => @attorney.errors, :status => :unprocessable_entity }
end
end
end
del Procurador Vista:
<% form_for(@attorney, :html => {:multipart => true}) do |f| %>
<%= f.error_messages %>
<%= f.label :"First name" %>
<%= f.text_field :firstname %><br>
<%= f.label :"Last Name" %>
<%= f.text_field :lastname %><br>
<%= f.label :"Attorney Type" %>
<%= f.collection_select :member_type_id, MemberType.all, :id, :name %><br>
<%= f.text_area :bio, :cols => 70, :rows => 20 %><br><br>
<%= f.label :"Attorney Location" %>
<%= f.collection_select :office_location_id, OfficeLocation.all, :id, :location %><br>
<div id="associations">
<%= render :partial => 'shared/membership' %>
</div>
<%= add_association_link "Add Association" %>
<%= f.submit 'Create' %>
<% end %>
afiliación parcial:
<div class="association">
<% fields_for :associations do |assoc_form| %>
<%= assoc_form.collection_select(:association_id, Association.find(:all), :id, :name, :include_blank => true) %>
<% = link_to_function "eliminar", "$ (this) .up ('asociación'.) Eliminar()". %> <% = link_to 'Nueva Asociación', new_association_path%> extremo <% Hel%>
Fiscal por Link:
def add_association_link(name)
link_to_function name do |page|
page.insert_html :bottom, :associations, :partial => 'shared/membership', :object => AssociationsAttorneys.new
end
end
Únete tabla de migración: la captura
class CreateAssociationsAttorneys < ActiveRecord::Migration
def self.up
create_table :associations_attorneys do |t|
t.references :attorney, :null => false
t.references :association, :null => false
t.timestamps
end
end
def self.down
drop_table :associations_attorneys
end
end
Log:
Processing AttorneysController#new (for 127.0.0.1 at 2009-12-04 08:16:19) [GET]
Rendering template within layouts/default
Rendering attorneys/new
[4;35;1mMemberType Load (0.4ms)[0m [0mSELECT * FROM "member_types" [0m
[4;36;1mOfficeLocation Load (18.6ms)[0m [0;1mSELECT * FROM "office_locations" [0m
[4;35;1mAssociation Load (0.6ms)[0m [0mSELECT * FROM "associations" [0m
Rendered shared/_membership (3.5ms)
[4;36;1mCACHE (0.0ms)[0m [0;1mSELECT * FROM "associations" [0m
Rendered shared/_membership (1.5ms)
Rendered shared/_nav (0.6ms)
Rendered shared/_footer (0.1ms)
Completed in 149ms (View: 114, DB: 20) | 200 OK [http://localhost/attorneys/new]
Processing ApplicationController#index (for 127.0.0.1 at 2009-12-04 08:16:19) [GET]
Processing AttorneysController#create (for 127.0.0.1 at 2009-12-04 08:16:57) [POST]
Parameters: {"commit"=>"Create", "authenticity_token"=>"Jh7aMCcOY7jUu/D1YtiCswg2n6iwqnS98VnVn46psp0=", "associations"=>{"association_id"=>"3"}, "attorney"=>{"birthstate"=>"Alabama", "office_location_id"=>"1", "birthdate"=>"December 3, 2009", "birthcity"=>"Test", "middlename"=>"Test", "lastname"=>"Testing", "image_temp"=>"", "member_type_id"=>"2", "firstname"=>"Test", "bio"=>"testing testing testing", "suffix"=>"", "email"=>"[email protected]"}}
[4;35;1mAttorney Load (15.6ms)[0m [0mSELECT "attorneys".id FROM "attorneys" WHERE ("attorneys"."email" = '[email protected]') LIMIT 1[0m
[4;36;1mAttorney Create (0.8ms)[0m [0;1mINSERT INTO "attorneys" ("birthstate", "created_at", "birthdate", "office_location_id", "birthcity", "updated_at", "middlename", "lastname", "firstname", "member_type_id", "suffix", "bio", "image", "email") VALUES('Alabama', '2009-12-04 15:16:57', 'December 3, 2009', 1, 'Test', '2009-12-04 15:16:57', 'Test', 'Testing', 'Test', 2, '', 'testing testing testing', NULL, '[email protected]')[0m
Redirected to http://localhost:3000/attorneys/11
Completed in 150ms (DB: 16) | 302 Found [http://localhost/attorneys]
puedo ver que las asociaciones "=> {" association_id "=>" 3" } se solo está obteniendo la última de las múltiples asociaciones que tuve para la persona en particular y no está creando ninguna entrada en la tabla de unión. ¿Dónde podría haber salido mal mi código?
Cambiando el fin de pasar en forma 'f', ahora estoy recibiendo el error: no definido método 'association_id 'para # en esta línea en el parcial: <% = assoc_form.collection_select (: association_id, Association.find (: all),: id ,: nombre,: include_blank => verdadero)%>. ¿Algunas ideas? –
davidstites
Parece que pasé por alto una cantidad de otros problemas que estaba teniendo. Actualicé la solución para abordar esos también. – EmFi
, así que he trabajado en esto durante varias semanas y sigo teniendo problemas. cuando intenta convertir a la asociación de abogados en parcial, se queja de no saber qué es 'f' ... pensé que el objeto de formulario se había pasado con el hash de los locales: ¿hash? – davidstites