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.