#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. У меня все было так, как вы описали, но я прокомментировал / отредактировал, чтобы найти решение. Однако подтверждение того, как это должно быть, помогло мне разобраться. Большое спасибо!