2016-04-29 5 views
0

Принудительно попросить о помощи в сохранении вложенных моделей в полиморфной ассоциации. Я что-то упускаю, но не могу понять, что. Everithing довольно просто. Существует Адрес, который может иметь несколько телефонов. Так моделиНе удается сохранить вложенную модель в полиморфной ассоциации

class Address < ActiveRecord::Base  
    has_many :phones, as: :phoneable 
    accepts_nested_attributes_for :phones, allow_destroy: true 
    validates :city, :street, :building, :name, presence: true 
end 

и

class Phone < ActiveRecord::Base 
    belongs_to :phoneable, polymorphic: true 
    validates :number, :extension, presence: true   
end 

addresses_controller.rb

def new 
    @address = Address.new 
    @phone = @address.phones.build 
    authorize @address 
end 

def create 
    @address = Address.create(address_params) 
    authorize @address 
    if @address.save 
    binding.pry 
    flash[:success] = "Address #{@address.name} created" 
    redirect_to address_path(@address) 
    else 
    flash.now[:danger] = 'Failed' 
    render :new 
    end 
end 

def address_params 
    params.require(:address).permit(:name, :street, :building, :city, phones_attributes: [:id, :number, :extension, :details]) 
end 

/app/views/address.html.erb

<div class="row"> 
     <div class="col-md-12"> 
     <%= form_for(@address, html: {class: 'form-horizontal', role: 'form'}) do |f| %> 
      <%= render 'shared/errors', obj: @address, model_name: 'addresses' %> 
      <div id="create-form"> 
      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= f.label :city, 'Город' %> 
       </div> 
       <div class="col-md-4"> 
       <%= f.select(:city, options_for_select(['Moscow', 'Samara']), {}, {class: "form-control"}) %> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= f.label :street, 'Street' %> 
       </div> 
       <div class="col-md-4"> 
       <%= f.text_field :street, class: 'form-control' %> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= f.label :building, 'Building' %> 
       </div> 
       <div class="col-md-4"> 
       <%= f.text_field :building, class: 'form-control' %> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= f.label :name, 'Place name' %> 
       </div> 
       <div class="col-md-4"> 
       <%= f.text_field :name, class: 'form-control' %> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= f.label :phones, 'Phone' %> 
       </div> 
       <div class="col-md-4"> 
       <%= f.fields_for :phone do |phone_form| %> 
        <%= phone_form.text_field :number, class: 'form-control' %> 
       </div> 
      </div> 

      <div class="form-group"> 
       <div class="control-label col-md-4"> 
       <%= phone_form.label :extension, 'Ext.' %> 
       </div> 
       <div class="col-md-4"> 
       <%= phone_form.text_field :extension, class: 'form-control' %> 
       </div> 
       <% end %> 
      </div> 

      <div class="form-group"> 
       <div class='col-md-offset-4 col-md-6'> 
       <%= f.submit @address.new_record? ? 'Add' : 'Update', class: 'btn btn-primary btn-md' %> 
       </div> 
      </div> 
      </div> 
     <% end %> 
     </div> 
    </div> 

Первый вопрос, с которым я столкнулся, - это если я установил ключ :phones вместо :phone в следующую строку <%= f.fields_for :phone do |phone_form| %> текстовые поля телефона не отображаются, но они должны. Один пользователь подчеркнул этот момент здесь https://stackoverflow.com/a/3328041/2049476 , если я использую :phone, все как-то отлично работает, но похоже, что это неправильно. И второй. Телефонный объект не сохраняет в БД, когда я создаю новый адрес или редактирую текущий, мне удастся, но на телефоне не отображаются ошибки проверки, если я оставлю все поля пустыми. Вот что я имею в params хэш

{"utf8"=>"✓", "authenticity_token"=>"inwXr3Ev/Aj/hZRY2IadizDHDgdSFo2zFhY9DAvysfFu3jjD9AS66esKVsTzEuKo2WC46YQt6HnOKTgInvfUEg==", "address"=>{"city"=>"Moscow", "street"=>"ul. Tsentralnaya d. 4 kv. 220", "building"=>"1212", "name"=>"Astoria", "phone"=>{"number"=>"9215555555", "extension"=>"111"}}, "commit"=>"Add", "controller"=>"addresses", "action"=>"create"}

Что мне не хватает?

+0

1. http://stackoverflow.com/questions/4853373/rails-fields-for-with-index –

+0

2. пасс а не 'phone' через Params. но массив хэшей 'phones_attributes' –

ответ

0

Try ответ на 2 вопроса:

  1. Правильный путь пройти :phones, а затем phone в качестве переменной field_for, как есть было сделано here:

    <%- @address.phones.each.with_index do |phone, index| %> 
        <%- f.fields_for :phones, phone do |phone_form| %> 
    
        <%- end %> 
    <%- end %> 
    
  2. должны быть решены начиная с 1-го вопроса, поскольку поля shoudl отправлены на сервер через params, а не phone хэш, но phones_attributes массив хешей, чтобы accepts_nested_attributes_for может принять телефоны:

    phones_attributes: [{ ... },{ ... }] 
    
+0

Вы спасли мой день! Сейчас все работает. Большое спасибо. Всего наилучшего! –

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