has_one с :class_name и отношением exists_to неправильно устанавливает атрибуты в rails 3.2.3

Я пытаюсь создать форму для установки значений для двух дочерних объектов через has_one (с параметром :class_name) и отношения contains_to. Однако, когда я ввожу и отправляю значения через форму, оба дочерних объекта имеют одинаковое значение, даже если я ввожу разные значения.

У меня есть эти две модели. (два дочерних объекта выше указывают на «источник» и «назначение», имена классов которых «Место»)

class Route < ActiveRecord::Base
  attr_accessible :name, :destination_attributes, :origin_attributes                                            
  has_one :origin, :class_name=>"Place"
  has_one :destination, :class_name=>"Place"
  accepts_nested_attributes_for :origin, :destination
end

class Place < ActiveRecord::Base                                                                                                                                              
  attr_accessible :address, :lat, :lng, :name, :route_id
  belongs_to :route, :foreign_key => "route_id"
end

И сделал форму, используя частичное, как показано ниже.

маршруты/_form.html.erb

<%= form_for(@route) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
    <br />
    <%= render :partial => "places/nested_places_form", :locals => {record_name: :origin, place_object: @route.origin, parent_form: f} %>
    <br />
    <%= render :partial => "places/nested_places_form", :locals => {record_name: :destination, place_object: @route.destination, parent_form: f} %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

места/nested_places_form.html.erb

 <%= parent_form.fields_for record_name, place_object  do |t| %>                                                                                                               
  <%= record_name %>

  <% if place_object.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@place.errors.count, "error") %> prohibited this place from being saved:</h2>

      <ul>
      <% @place.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= t.label :name %><br />
    <%= t.text_field :name %>
  </div>
  <div class="field">
    <%= t.label :lat %><br />
    <%= t.text_field :lat %>
  </div>
  <div class="field">
    <%= t.label :lng %><br />
    <%= t.text_field :lng %>
  </div>
<% end %>                                                                                                                                                                     

Как я уже упоминал, атрибуты происхождения и назначения всегда заканчиваются одним и тем же, даже когда я помещаю разные значения в пробелы и отправляю из формы.

Как я могу заставить это работать?


person Ryo    schedule 29.04.2012    source источник


Ответы (1)


Каким-то образом вам нужно будет различать источник и пункт назначения в базе данных. Если они оба имеют один и тот же класс и хранятся в одной и той же таблице, их ничто не отличит друг от друга. Если вы не хотите изменять существующие отношения, вам может понадобиться использовать для этого STI и сделать исходный и целевой классы разными:

class OriginPlace < Place
end

class DestinationPlace < Place
end

class Route < ActiveRecord::Base
  ...
  has_one :origin, :class_name=>"OriginPlace"
  has_one :destination, :class_name=>"DestinationPlace"
  ...
ene

Для этого потребуется поле type в таблице адресов.

person Peter Brown    schedule 29.04.2012
comment
Я не знал, что это невозможно, и это именно то, что я хотел! Я попытаюсь! Большое Вам спасибо!! - person Ryo; 29.04.2012