problem with has_many

Hello everybody i'm new working with rails.

I want to creata new relation in my app but it fail. This is the code:

model profile.rb

class Profile < ActiveRecord::Base

  has_many :responsibles

end

model reponsible.rb class Responsible < ActiveRecord::Base

  belongs_to :profile, :class_name => 'Profile', :foreign_key => 'profile_id'

end

in the controller responsibles_controller.rb

class Member::ResponsiblesController < Member::BaseController

  def create     @responsibles = current_user.responsibles.build(params[:responsible].values)     @responsible.save!

    flash[:ok] = I18n.t("tog_picto.member.responsibles_created")     redirect_to profile_path(profile)   end

  def update     responsible.update_attributes!(params[:responsibles])     responsible.save     flash[:ok] = I18n.t("tog_social.profiles.member.responsibles_created")     redirect_to profile_path(profile)   end

end

and in the view to edit the profile i want to add if it's possible update the responsibles:

<%= error_messages_for :profile %>

  <% form_for :profile, :url => member_profile_path(@profile), :html => {:method => :put, :multipart=>true} do |f| -%>     <fieldset>       <legend><%= I18n.t('tog_social.profiles.member.profile_details') %></legend>       <div class="fields">         <!--Nombre del perfil-->         <p>           <label for="profile_first_name"><%= I18n.t('tog_social.profiles.model.first_name') %></label>           <%= f.text_field :first_name, :class=>"fieldbox" %>         </p>       <!--Apellidos del perfil-->         <p>           <label for="profile_last_name"><%= I18n.t('tog_social.profiles.model.last_name') %></label>           <%= f.text_field :last_name, :class=>"fieldbox" %>         </p>

      <p>         <label for="profile_situation"><%= I18n.t('tog_social.profiles.model.situation') %> </label>       <select name="profile[situation]" class="fieldbox">           <option value="">               <%= I18n.t("tog_social.profiles.model.select_situation") %>             </option>         <option value="Activo">Activo</option>         <option value="Desempleado">Desempleado</option>         <option value="Estudiante">Estudiante</option>         <option value="Jubilado">Jubilado</option>       </select>       </p>

      <p>         <%= check_box_tag 'profile_demandante_de_empleo'%>       <label for="profile_demandante_de_empleo">         <%= I18n.t('tog_social.profiles.model.demandante_de_empleo') %>

      </label>       </p>

       <p>         <label for="profile_profession"><%= I18n.t('tog_social.profiles.model.profession') %></label>           <%= f.text_field :profession, :class=>"fieldbox" %>       </p>

      <!--Lugar del usuario-->       <p>         <label for="profile_place"><%= I18n.t('tog_social.profiles.model.place') %></label>       <select name="profile[place]" class="fieldbox">           <option value="">               <%= I18n.t("tog_social.profiles.model.select_place") %>             </option>         <option value="Álava">Álava</option>         <option value="Albacete">Albacete</option>         <option value="Alicante">Alicante</option>         <option value="Almería">Almería</option>         <option value="Asturias">Asturias</option>         <option value="Ávila">Ávila</option>         <option value="Badajoz">Badajoz</option>         <option value="Barcelona">Barcelona</option>         <option value="Burgos">Burgos</option>         <option value="Cáceres">Cáceres</option>         <option value="Cádiz">Cádiz</option>         <option value="Cantabria">Cantabria</option>         <option value="Castellón">Castellón</option>         <option value="Ciudad Real">Ciudad Real</option>         <option value="Córdoba">Córdoba</option>         <option value="Cuenca">Cuenca</option>         <option value="Gerona">Gerona</option>         <option value="Granada">Granada</option>         <option value="Guadalajara">Guadalajara</option>         <option value="Guipúzcua">Guipúzcua</option>         <option value="Huelva">Huelva</option>         <option value="Huesca">Huesca</option>         <option value="Islas Baleares">Islas Baleares</option>         <option value="Jaén">Jaén</option>         <option value="La Coruña">La Coruña</option>         <option value="Las Palmas">Las Palmas</option>         <option value="León">León</option>         <option value="Lérida">Lérida</option>         <option value="Lugo">Lugo</option>         <option value="Madrid">Madrid</option>         <option value="Málaga">Málaga</option>         <option value="Murcia">Murcia</option>         <option value="Navarra">Navarra</option>         <option value="Orense">Orense</option>         <option value="Palencia">Palencia</option>         <option value="Las Palmas">Las Palmas</option>         <option value="Pontevedra">Pontevedra</option>         <option value="La Rioja">La Rioja</option>         <option value="Salamanca">Salamanca</option>         <option value="Segovia">Segovia</option>         <option value="Sevilla">Sevilla</option>         <option value="Soria">Soria</option>         <option value="Tarragona">Tarragona</option>         <option value="Santa Cruz de Tenerife">Santa Cruz de Tenerife</

        <option value="Teruel">Teruel</option>         <option value="Toledo">Toledo</option>         <option value="Valencia">Valencia</option>         <option value="Valladolid">Valladolid</option>         <option value="Vizcaya">Vizcaya</option>         <option value="Zamora">Zamora</option>         <option value="Zaragoza">Zaragoza</option>       </select>       </p>

      <!--email del Usuario-->         <p>           <label for="profile_contact_email"><%= I18n.t('tog_social.profiles.model.contact_email') %></label>           <%= f.text_field :contact_email, :class=>"fieldbox wide" %>         </p>

      <!--tlf del Usuario-->         <p>           <label for="profile_tlf"><%= I18n.t('tog_social.profiles.model.tlf') %></label>           <%= f.text_field :tlf, :class=>"fieldbox wide" %>         </p>

      <!--Web del usuario-->         <p>           <label for="profile_website"><%= I18n.t('tog_social.profiles.model.website') %></label>           <%= f.text_field :website, :class=>"fieldbox wide" %>         </p>

      <!--CV del usuario-->       <p>           <label for="profile_pdf"><%= I18n.t('tog_social.profiles.model.curriculum') %></label>           <%= file_field "profile", "pdf_file_name" %><br />       <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.curriculum_help') %></span>         </p>

      <!--Imagen del usuario-->         <p>           <label for="profile_icon"><%= I18n.t('tog_social.profiles.model.avatar') %></label>           <%= icon_for_profile(@profile, 'big')%>           <%= file_field "profile", "icon" %><br />           <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.avatar_help') %></span>         </p>       </div>     </fieldset>

    <div class="actions">         <%= submit_tag I18n.t('tog_social.profiles.member.update_profile'), {:accesskey => "s", :class=>"button mainaction"} %>       </div>

  <% end -%><!-- /.formulario del usuario -->

  <!--Ahora se trata de un usuario que tiene pyme(es_pyme == 'true'),      en este caso para actualizar el perfil mostraríamos:

     - Nombre de la empresa      - Localidad      - Direccion      - Actividad de la empresa      - Página Web      - Catálogo de productos si desea      - y una imagen para el perfil de la empresa.   -->

    <!--Mostramos la posibilidad de añadir responsables de la empresa-->     <hr class="wide" />   <% end -%>   <div class="titleB"><%= I18n.t('tog_social.profiles.member.add_responsibles') %></div>

    <% form_for :responsible, :url => member_profile_path(@profile), :html => {:method => :put, :multipart=>true} do |f| -%>       <fieldset>         <div class="fields">

             <script type="text/javascript">           function new_responsible(i, n) {             $('fs_responsible_' + n).toggle();             $('link_fs_photo_' + i).toggle();             $('link_fs_photo_' + n).toggle();           }         </script>

            <% 5.times do |i| -%>           <div class="fields">                 <fieldset id="fs_responsible_<%=i%>" <%if

0%>style="display:none"<%end%>>

                  <p><label for="profile.responsibles_responsible_name">< %= I18n.t("tog_social.profiles.model.responsible_name") %></label> <%= text_field "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                   <p><label for="profile.responsibles_responsible_mail">< %= I18n.t("tog_social.profiles.model.responsible_email") %></label> < %= text_field "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                   <p><label for="profile.responsibles_responsible_tlf">< %= I18n.t("tog_social.profiles.model.responsible_tlf") %></label> <%= text_field "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                 </fieldset>           </div>           <%if i < 4 %>             <div id="link_fs_responsible_<%=i%>" <%if

0%>style="display:none"<%end%>>

              <a href="javascript:new_responsible(<%=i%>, <%=i+1%>)" class="add"><%= I18n.t("tog_social.profiles.member.add_one_more_responsible") %></a>             </div>           <%end%>             <% end -%>

        </div>       </fieldset>

      <br />     <div class="actions">           <%= submit_tag I18n.t('tog_social.profiles.member.update_responsibles'), {:accesskey => "s", :class=>"button mainaction"} %>         </div>

    <% end -%>

and i want to know how can i add the second form about responsibles?

thanks

What you want to use is :accept_nested_attributes in your models

class Profile < ActiveRecord::Base

  has_many :responsibles   accepts_nested_attributes :responsibles

end

And then you'll want to do something like this in your view

<% form_for @profile do |profile_form| %>

  <%= profile_form.label :name %>   <%= profile_form.text_field :name %>

  <% profile_form.fields_for :responsibles do |child_form| %>

    <%= child_form.label :name %>     <%= child_form.text_field :name %>

    <% unless child_form.object.new_record? %>       <%= child_form.check_box '_delete' %>       <%= child_form.label '_delete', 'Remove' %>     <% end %>

  <% end %>

  <%= submit_tag %> <% end %>

That's all

In order to use this, you have to ensure you're using rails 2 but I'm sure you are.

Here's more info http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

Thanks Luis

I did what you said me, but when I submit the form I see that the field send well, but in the table of responsibles don't appear the responsibles, Could you tell me why? Is necessary to do something in the profiles_controller?

I have the next code for your help:

<% form_for :profile, :url => member_profile_path(@profile), :html => {:method => :put, :multipart=>true} do |f| -%>       <fieldset>         <legend><%= I18n.t('tog_social.profiles.member.profile_details') %></legend>         <div class="fields">           <!--Nombre de la empresa-->           <p>             <label for="profile_first_name"><%= I18n.t('tog_social.profiles.model.pyme_name') %></label>             <%= f.text_field :first_name, :class=>"fieldbox wide" %>           </p>

          <!--Tipo de empresa-->           <p>               <label for="profile_type_of_pyme"><%= I18n.t('tog_social.profiles.model.type_of_pyme') %></label>             <select name="profile[type_of_pyme]" class="fieldbox">                 <option value="">                 <%= I18n.t("tog_social.profiles.model.select_type_of_pyme") %>               </option>               <option value="Micro-empresa">Micro-empresa</option>               <option value="Pequeña-empresa">Pequeña-empresa</option>               <option value="Mediana-empresa">Mediana-empresa</option>               <option value="Gran-empresa">Gran-empresa</option>             </select>           </p>

          <p>             <label for="profile_direction"><%= I18n.t('tog_social.profiles.model.pyme_direction') %></label>             <%= f.text_field :direction, :class=>"fieldbox wide" %>           </p>

          <!--email de la Pyme-->           <p>             <label for="profile_contact_email"><%= I18n.t('tog_social.profiles.model.contact_email') %></label>             <%= f.text_field :contact_email, :class=>"fieldbox wide" %>           </p>

          <!--tlf de la Pyme-->           <p>             <label for="profile_tlf"><%= I18n.t('tog_social.profiles.model.tlf') %></label>             <%= f.text_field :tlf, :class=>"fieldbox wide" %>           </p>

          <!--fax de la Pyme-->           <p>             <label for="profile_fax"><%= I18n.t('tog_social.profiles.model.fax') %></label>             <%= f.text_field :fax, :class=>"fieldbox wide" %>           </p>

          <!--Web de la Pyme-->           <p>             <label for="profile_website"><%= I18n.t('tog_social.profiles.model.website') %></label>             <%= f.text_field :website, :class=>"fieldbox wide" %>           </p>

          <!--Catálogo de productos de la Pyme-->           <p>             <label for="profile_pdf"><%= I18n.t('tog_social.profiles.model.catalogue') %></label>             <%= file_field "profile", "pdf_file_name" %><br />             <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.catalogue_help') %></span>           </p>

          <!--Imagen de la Pyme -->           </br>           <p>             <label for="profile_icon"><%= I18n.t('tog_social.profiles.model.avatar') %></label>             <%= icon_for_profile(@profile, 'big')%>             <%= file_field "profile", "icon" %><br />             <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.avatar_help') %></span>           </p>         </div>       </fieldset>

      </br>

    <!--Mostramos la posibilidad de añadir responsables de la empresa--

    <hr class="wide" />

    <div class="titleB"><%= I18n.t('tog_social.profiles.member.add_responsibles') %></div>

      <% f.fields_for :responsibles do |responsible_form| %>         <fieldset>           <div class="fields">

               <script type="text/javascript">                 function new_responsible(i, n) {                   $('fs_responsible_' + n).toggle();                   $('link_fs_photo_' + i).toggle();                   $('link_fs_photo_' + n).toggle();                 }               </script>

              <% 5.times do |i| -%>                   <div class="fields">                   <fieldset id="fs_responsible_<%=i%>" <%if

0%>style="display:none"<%end%>>

                    <p><label for="responsible_name"><%= I18n.t("tog_social.profiles.model.responsible_name") %></label> <%= text_field :responsible_name, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                       <p><label for="responsible_email"><%= I18n.t("tog_social.profiles.model.responsible_email") %></label> <%= text_field :responsible_email, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                       <p><label for="responsible_tlf"><%= I18n.t("tog_social.profiles.model.responsible_tlf") %></label> < %=text_field :responsible_tlf, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p>                   </fieldset>                   </div>                   <%if i < 4 %>                   <div id="link_fs_responsible_<%=i%>" <%if

0%>style="display:none"<%end%>>

                        <a href="javascript:new_responsible(<%=i%>, < %=i+1%>)" class="add"><%= I18n.t("tog_social.profiles.member.add_one_more_responsible") %></a>                   </div>                   <%end%>               <% end -%>

          </div>           </fieldset>

          <br />         <div class="actions">           <%= submit_tag I18n.t('tog_social.profiles.member.update_profile'), {:accesskey => "s", :class=>"button mainaction"} %>         </div>

      <% end -%>

    <% end -%><!-- /.formulario de la Pyme -->

Thanks sorry for so many inconveniences.

Thanks Luis

I did what you said me, but when I submit the form I see that the field send well, but in the table of responsibles don't appear the responsibles, Could you tell me why? Is necessary to do something in the profiles_controller?

I have the next code for your help:

<% form_for :profile, :url => member_profile_path(@profile), :html => {:method => :put, :multipart=>true} do |f| -%> <fieldset> <legend><%= I18n.t('tog_social.profiles.member.profile_details') %></legend> <div class="fields"> <!--Nombre de la empresa--> <p> <label for="profile_first_name"><%= I18n.t('tog_social.profiles.model.pyme_name') %></label> <%= f.text_field :first_name, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-Tipo de empresa\-\-&gt;
      &lt;p&gt;
          &lt;label for=&quot;profile\_type\_of\_pyme&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.type_of_pyme') %></label> <select name="profile[type_of_pyme]" class="fieldbox"> <option value=""> <%= I18n.t("tog_social.profiles.model.select_type_of_pyme") %> </option> <option value="Micro-empresa">Micro-empresa</option> <option value="Pequeña-empresa">Pequeña-empresa</option> <option value="Mediana-empresa">Mediana-empresa</option> <option value="Gran-empresa">Gran-empresa</option> </select> </p>

      &lt;p&gt;
        &lt;label for=&quot;profile\_direction&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.pyme_direction') %></label> <%= f.text_field :direction, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-email de la Pyme\-\-&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_contact\_email&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.contact_email') %></label> <%= f.text_field :contact_email, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-tlf de la Pyme\-\-&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_tlf&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.tlf') %></label> <%= f.text_field :tlf, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-fax de la Pyme\-\-&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_fax&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.fax') %></label> <%= f.text_field :fax, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-Web de la Pyme\-\-&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_website&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.website') %></label> <%= f.text_field :website, :class=>"fieldbox wide" %> </p>

      &lt;\!\-\-Catálogo de productos de la Pyme\-\-&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_pdf&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.catalogue') %></label> <%= file_field "profile", "pdf_file_name" %><br /> <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.catalogue_help') %></span> </p>

      &lt;\!\-\-Imagen de la Pyme \-\-&gt;
      &lt;/br&gt;
      &lt;p&gt;
        &lt;label for=&quot;profile\_icon&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.model.avatar') %></label> <%= icon_for_profile(@profile, 'big')%> <%= file_field "profile", "icon" %><br /> <span class="helpinfo"><%= I18n.t('tog_social.profiles.model.avatar_help') %></span> </p> </div> </fieldset>

  &lt;/br&gt;

&lt;\!\-\-Mostramos la posibilidad de añadir responsables de la empresa\-\-

&lt;hr class=&quot;wide&quot; /&gt;

&lt;div class=&quot;titleB&quot;&gt;&lt;%=

I18n.t('tog_social.profiles.member.add_responsibles') %></div>

  &lt;% f\.fields\_for :responsibles do |responsible\_form| %&gt;
    &lt;fieldset&gt;
      &lt;div class=&quot;fields&quot;&gt;

           &lt;script type=&quot;text/javascript&quot;&gt;
            function new\_responsible\(i, n\) \{
              $\(&#39;fs\_responsible\_&#39; \+ n\)\.toggle\(\);
              $\(&#39;link\_fs\_photo\_&#39; \+ i\)\.toggle\(\);
              $\(&#39;link\_fs\_photo\_&#39; \+ n\)\.toggle\(\);
            \}
          &lt;/script&gt;

          &lt;% 5\.times do |i| \-%&gt;
              &lt;div class=&quot;fields&quot;&gt;
              &lt;fieldset id=&quot;fs\_responsible\_&lt;%=i%&gt;&quot; &lt;%if

>0%>style="display:none"<%end%>> <p><label for="responsible_name"><%= I18n.t("tog_social.profiles.model.responsible_name") %></label> <%= text_field :responsible_name, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p> <p><label for="responsible_email"><%= I18n.t("tog_social.profiles.model.responsible_email") %></label> <%= text_field :responsible_email, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p> <p><label for="responsible_tlf"><%= I18n.t("tog_social.profiles.model.responsible_tlf") %></label> < %=text_field :responsible_tlf, "responsible[#{i}]", {:class => "fieldbox", :size => "40"} %></p> </fieldset> </div> <%if i < 4 %> <div id="link_fs_responsible_<%=i%>" <%if >0%>style="display:none"<%end%>> <a href="javascript:new_responsible(<%=i%>, < %=i+1%>)" class="add"><%= I18n.t("tog_social.profiles.member.add_one_more_responsible") %></a> </div> <%end%> <% end -%>

      &lt;/div&gt;
      &lt;/fieldset&gt;

      &lt;br /&gt;
    &lt;div class=&quot;actions&quot;&gt;
      &lt;%= submit\_tag

I18n.t('tog_social.profiles.member.update_profile'), {:accesskey => "s", :class=>"button mainaction"} %> </div>

  &lt;% end \-%&gt;

&lt;% end \-%&gt;&lt;\!\-\- /\.formulario de la Pyme \-\-&gt;

Thanks sorry for so many inconveniences.