Rails 4.1.1 связанный атрибут модели с не сохраняемой вложенной формой

#ruby-on-rails-4 #nested-attributes

#ruby-on-rails-4 #вложенные атрибуты

Вопрос:

Когда я отправляю свою форму для сохранения записи, вложенное значение (в модели Ride) с именем ‘test’ не сохраняется.

Корректен ли мой метод entry_params в отношении разрешения использования вложенного атрибута? У меня нет значения ride_id в записи entry при проверке объекта entry:

 --- !ruby/object:Entry
attributes:
  id: 47
  show_date: 0008-08-08
  user_id: 
  ride_id: 
  created_at: 2014-07-04 21:08:49.294361000 Z
  updated_at: 2014-07-04 21:08:49.294361000 Z
  

У меня есть модели:

 class Entry < ActiveRecord::Base    
  has_many :rides, :dependent => :destroy    
  has_many :horses, :through => :rides, :dependent => :destroy    
  has_many :riders, :through => :rides, :dependent => :destroy    
end    

class Ride < ActiveRecord::Base    
  belongs_to :entry    
  has_many :horses, :dependent => :destroy    
  has_many :riders, :dependent => :destroy    
end   
  

мой файл контроллера частичной записи:

 class EntriesController < ApplicationController
  before_action :set_entry, only: [:show, :edit, :update, :destroy]

def new
  @entry = Entry.new
  1.times do
    @entry.rides.build
  end
end

def create
  @entry = Entry.create(entry_params)
  respond_to do |format|
    if @entry.save  
      format.html { redirect_to @entry, notice: 'Entry was successfully created.' }
      format.json { render :show, status: :created, location: @entry }
    else
      format.html { render :new }
      format.json { render json: @entry.errors, status: :unprocessable_entity }
    end
 end
end

def destroy
  @entry.destroy
  respond_to do |format|
    format.html { redirect_to entries_path, notice: 'Entry was successfully deleted.' }
    format.json { head :no_content }
  end
end 

private
  # Use callbacks to share common setup or constraints between actions.
  def set_entry
    @entry = Entry.find(params[:id])
  end

  def entry_params
    params.require(:entry).permit(:show_date, ride_attributes: [:test])
  end
  

завершение

Моя форма для отправки записи с вложенным атрибутом:

 <%= form_for (@entry), :url => entries_path do |f| %>
<p>
  <%= f.label :show_date %><br>
  <%= f.text_field :show_date %>
</p>
<%= f.fields_for :rides do |builder| %>  
<p>  
  <%= builder.label :test %><br>
  <%= builder.text_field :test %>
</p>
<% end %>   
<p>
<%= f.submit %>
</p>
<% end %>
  

Ответ №1:

Проблема в том, что вы чего-то не хватает accepts_nested_attributes_for :rides в вашей Entry модели.

 class Entry < ActiveRecord::Base    
  has_many :rides, :dependent => :destroy    
  has_many :horses, :through => :rides, :dependent => :destroy    
  has_many :riders, :through => :rides, :dependent => :destroy  
  accepts_nested_attributes_for :rides 
end 
  

Из API

Вложенные атрибуты позволяют сохранять атрибуты в связанных записях через родительскую

Итак, в вашем случае rides_attributes не сохраняются, потому что у вас нет accepts_nested_attributes_for :rides в вашей Entry модели

А также ваш entry_params должен выглядеть следующим образом

 def entry_params
  params.require(:entry).permit(:show_date, rides_attributes: [:test]) 
end
  

У вас есть has_many :rides , так что этого не должно быть rides_attributes ride_attributes .

Комментарии:

1. У меня все было так, как вы описали, но я прокомментировал / отредактировал, чтобы найти решение. Однако подтверждение того, как это должно быть, помогло мне разобраться. Большое спасибо!