0

作成した属性を持つ 3 つのテーブルは次のとおりです。

テーブル名: um_org_data、属性:id, org_name, org_description, webdomain

テーブル名: addresses、属性:id, offc_addr, um_org_datum_id

テーブル名: phone_nos、属性:offc_ph, offc_ext, address_id

ここで、名前を持つ組織に複数の住所Organization 1:M addressesがあり、住所に複数の電話番号があることを望んでいますaddress 1:M telephone_no

私のコントローラーからのコードは次のとおりです。

um_org_datum.rb

class UmOrgDatum < ActiveRecord::Base

    attr_accessible :org_description, :org_name, :webdomain, :addresses, :addresses_attributes

    has_many :addresses

      accepts_nested_attributes_for :addresses
    end

アドレス.rb

class Address < ActiveRecord::Base
      attr_accessible :offc_addr

  belongs_to :um_org_datum


  has_many :phone_nos

  accepts_nested_attributes_for :phone_nos
end

phone_no.rb

class PhoneNo < ActiveRecord::Base
  attr_accessible :offc_ph, :offc_ext

  belongs_to :address
end

組織と住所との関連付けは正常に機能しているため...ただし、複数の電話番号を作成するのに問題があります。

私のビューのコードは次のとおりです。

<%= simple_nested_form_for(@um_org_datum) do |f| %>
  <%= f.error_notification %>

  <div class="container">
    <div class="row">
      <div class="span3 pull-right">
        <div class="well">
          <h2>Heading</h2>
          <p>Sample text</p>
        </div> 
      </div> 

    <div class="span9">
      <%= simple_nested_form_for(@um_org_datum, :validate => true, :html => { :class => 'form-horizontal' }) do |f| %>


        <div class="control-group">
          <label class="control-label">Organization Name&nbsp;</label>
          <div class="controls">
            <div class="input-prepend">
                <%= f.text_field :org_name, required: true, :autofocus => true %>
            </div>
          </div>
        </div>

        <div class="control-group">
          <label class="control-label">Orgazination Description&nbsp;</label>
          <div class="controls">
            <%= f.text_area :org_description, :cols => "100", :rows => "10" %>
          </div>
        </div>

        <div class="control-group">
          <label class="control-label">Web Domain&nbsp;</label>
          <div class="controls">
            <div class="input-prepend">
                <%= f.text_field :webdomain, required: true, :autofocus => true %>
            </div>
          </div>
        </div>

        <div class="control-group">
            <label class="control-label">Office Address</label>
            <div class="controls">
                <%= f.link_to_add "<i class='icon-plus'></i>".html_safe, :addresses%>
                  <%= f.fields_for :addresses do |task_form| %>

                  <div class="input-prepend">

                    <%= task_form.text_field :offc_addr, :label => false, :placeholder => 'Office Address'%>

                    <div class="control-group">
                      <label class="control-label">Telephone</label>
                      <div class="controls">
                          <%= f.link_to_add "<i class='icon-plus'></i>".html_safe, :phone_nos%>
                            <%= f.fields_for :phone_nos do |task_form| %>

                            <div class="input-prepend">
                              <%= task_form.text_field :offc_ph, :label => false, :placeholder => 'Office Address'%>
                            </div>
                            <div class="input-prepend">
                              <%= task_form.text_field :offc_ext, :label => false, :placeholder => 'Office Extension'%>
                            </div>
                            <div class="input-prepend">
                              &nbsp;&nbsp;
                            <%= task_form.link_to_remove "<i class='icon-remove'></i>".html_safe%>
                          <% end %>        
                      </div>
                    </div> 

                  <div class="input-prepend">
                    &nbsp;&nbsp;
                  <%= task_form.link_to_remove "<i class='icon-remove'></i>".html_safe%>
                <% end %>        
            </div>
          </div> 

        <div class="control-group">
          <label class="control-label">Office Phone Number&nbsp;</label>
          <div class="controls">
            <div class="input-prepend">
                <%= f.text_field :offc_ph, required: true, :autofocus => true %>
            </div>
          </div>
        </div>         




        <div class="control-group">
          <div class="controls">
            <% if @um_org_datum.id == nil%>
              <button class="btn btn-primary" type="submit">Submit</button>
            <% else %>
              <button class="btn btn-primary" type="submit">Update</button>
            <% end %>
            <a class="btn" href="/um_org_data" style="text-color:black">Cancel</a>
          </div>
        </div>




<% end %>
      </div>
    </div>
  </div>




<% end %>

今私がやりたいことは、相互に循環依存している3つのテーブルがあることです....organizationテーブルで外部キーとして使用される主キーと、テーブルで外部キーとしてaddresses使用される独自の主キーを持つphone_nosテーブル。

アドレスの下の + ボタンをクリックすると、ユーザーが単一のアドレスに対して複数の電話を追加できる + ボタンで電話ラベルを表示するフォームが必要です。

4

1 に答える 1

0

組織ではなく、フォーム内のアドレスに phone_nos をラップする必要があります。

このブロックを変更します。

   <div class="control-group">
        <label class="control-label">Office Address</label>
        <div class="controls">
            <%= f.link_to_add "<i class='icon-plus'></i>".html_safe, :addresses%>
              <%= f.fields_for :addresses do |task_form| %>

              <div class="input-prepend">

                <%= task_form.text_field :offc_addr, :label => false, :placeholder => 'Office Address'%>

                <div class="control-group">
                  <label class="control-label">Telephone</label>
                  <div class="controls">
                      <%= f.link_to_add "<i class='icon-plus'></i>".html_safe, :phone_nos%>
                        <%= f.fields_for :phone_nos do |task_form| %>

                        <div class="input-prepend">
                          <%= task_form.text_field :offc_ph, :label => false, :placeholder => 'Office Address'%>
                        </div>
                        <div class="input-prepend">
                          <%= task_form.text_field :offc_ext, :label => false, :placeholder => 'Office Extension'%>
                        </div>
                        <div class="input-prepend">
                          &nbsp;&nbsp;
                        <%= task_form.link_to_remove "<i class='icon-remove'></i>".html_safe%>
                      <% end %>        
                  </div>
                </div> 

              <div class="input-prepend">
                &nbsp;&nbsp;
              <%= task_form.link_to_remove "<i class='icon-remove'></i>".html_safe%>
            <% end %>        
        </div>
      </div> 

これに:

   <div class="control-group">
        <label class="control-label">Office Address</label>
        <div class="controls">
            <%= f.link_to_add "<i class='icon-plus'></i>".html_safe, :addresses%>
              <%= f.fields_for :addresses do |task_form| %>

              <div class="input-prepend">

                <%= task_form.text_field :offc_addr, :label => false, :placeholder => 'Office Address'%>

                <div class="control-group">
                  <label class="control-label">Telephone</label>
                  <div class="controls">
                      <%= task_form.link_to_add "<i class='icon-plus'></i>".html_safe, :phone_nos%>
                        <%= task_form.fields_for :phone_nos do |phone_no| %>

                        <div class="input-prepend">
                          <%= phone_no.text_field :offc_ph, :label => false, :placeholder => 'Office Address'%>
                        </div>
                        <div class="input-prepend">
                          <%= phone_no.text_field :offc_ext, :label => false, :placeholder => 'Office Extension'%>
                        </div>
                        <div class="input-prepend">
                          &nbsp;&nbsp;
                        <%= phone_no.link_to_remove "<i class='icon-remove'></i>".html_safe%>
                      <% end %>        
                  </div>
                </div> 

              <div class="input-prepend">
                &nbsp;&nbsp;
              <%= task_form.link_to_remove "<i class='icon-remove'></i>".html_safe%>
            <% end %>        
        </div>
      </div> 

accept_nested_attributes_for の詳細については、ryan bates の railscasts を参照してください。 http://railscasts.com/episodes?utf8=%E2%9C%93&search=nested+model+form

API ドキュメントを確認するには: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

ところで、そのような基本的な質問については、railscasts.com が常に良い出発点でした。

更新: アドレス内のすべての phone_nos を表示するには:

アドレス phone_nos を介した単純なループ

<tr> 
  <th col span="1" style="width: 200px">Office Address: </th> 
  <td> 
    <% if @um_org_datum.addresses %> 
       <% @um_org_datum.addresses.each do |i| %> 
         <%= i.offc_addr %><br/>
         <% i.phone_nos.each do |phone_no| %>
           <%= phone_no.offc_ph %><br/>
           <%= phone_no.offc_ext %>
         <% end %>
       <% end %> 
    <% end %> 
  </td> 
</tr>
于 2013-08-20T09:52:32.800 に答える