2016-08-23 2 views
3

У меня есть две модели, родительская собственность, ребенок - телефон. При попытке создать новую запись свойства с вложенными данными телефона я получаю сообщение об ошибке: Свойства телефона должны существовать.Rails 5 сообщение об ошибке: модель родительской модели должна существовать

Я изучил Руководство по Rails и ряд других документов, не определяя причину. Вот ссылка общественного GitHub, если вы хотите увидеть весь код: https://github.com/allenroulston/testnest.git

class Property < ApplicationRecord 
    has_many :phones 
    accepts_nested_attributes_for :phones 
end 

class Phone < ApplicationRecord 
    belongs_to :property 
end 

# the form accepting the data 
<%= form_for(property) do |f| %> 
    <% if property.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(property.errors.count, "error") %> prohibited this property from being saved:</h2> 

     <ul> 
     <% property.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </div> 

    <div class="field"> 
    <%= f.label :address %> 
    <%= f.text_field :address %> 
    </div> 

    <div class="field"> 
    <%= f.label :city %> 
    <%= f.text_field :city %> 
    </div> 

    <div class="field"> 
    <%= f.label "Telephone (example: 613 555 1234)" %> 
    <%= f.fields_for :phones do |p| %> 
     Area Code <%= p.text_field :area %> 
     Exchange <%= p.text_field :exchange %> 
     Number <%= p.text_field :number %> 
    <% end %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 


# relevant controller methods ################## 

# GET /properties/new 
    def new 
    @property = Property.new 
    @property.phones.build 
    end 

    # POST /properties 
    # POST /properties.json 
    def create 
    @property = Property.new(property_params) 

    respond_to do |format| 
     if @property.save 
     format.html { redirect_to @property, notice: 'Property was successfully created.' } 
     format.json { render :show, status: :created, location: @property } 
     else 
     format.html { render :new } 
     format.json { render json: @property.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

Не могли бы вы добавить полный StackTrace вашей ошибки? –

+0

ошибка отображается в форме, аналогичной ошибке проверки. это не ошибка приложения. –

ответ

17

Насколько я знаю, это происходит потому, что при использовании nested_attributes_for при создании нового объекта, родительский объект еще не создан, поэтому при попытке создать ссылку на родительский объект проверка не выполняется. Чтобы исправить это, вы должны изменить на: has_many :phones, inverse_of: :property.

+1

'has_many: phones, inverse_of:: property' действительно разрешает ошибку проверки, хотя я признаю, что мне нужно сделать некоторое чтение, чтобы понять, почему/как он решил проблему. Спасибо. –

+3

@ AllenRoulston отлично читал для этого - https://www.viget.com/articles/exploring-the-inverse-of-option-on-rails-model-associations И вам будет приятно :) Пойми, если вы проверили вопрос как ответ :) – Kkulikovskis

+0

Я ценю ссылку на статью. как я могу отметить это? –

0

Вам нужно добавить в модели свойств, как: -

accepts_nested_attributes_for :phones, reject_if: :all_blank, allow_destroy: true 
+0

Не совсем - Может быть, он не хочет разрешать разрушение через вложенные атрибуты и/или сохранять пустые атрибуты. Это не имеет ничего общего с проверками, но больше с тем, что может произойти через вложенные атрибуты – Kkulikovskis

Смежные вопросы