Я столкнулся с той же проблемой, и вот мое решение (улучшения, основанные на ответе fl00r ):
Сделайте все как fl00r сказал.
Добавьте optional: true
к описанию класса
Класс Двигатель принадлежит_в машине: необязательный: истина конец
Дополнительная информация по адресу: http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html
Изменить
<%= f.fields_for :engine do |b| %>
<%= b.collection_select :id, Engine.all, :id, :name %>
...
<% end %>
до
<%= f.fields_for :engine, :include_id => false do |b| %>
<%= b.collection_select :id, Engine.all, :id, :name %>
...
<% end %>
Дополнительная информация по адресу: Остановить рельсы для создания скрытого поля для fields_for метода
Модифицируйте свой EngineController
3.1.Измените
def car_params
params.require(:car).permit(:name)
end
на
def car_params
params.require(:car).permit(:name, engine_attributes: [:id, :name])
end
Дополнительная информация: Rails 4 Вложенные атрибуты Неразрешенные параметры
3.1.Добавить функцию (приватную)
def set_engine
engine_id = car_params[:engine_attributes][:id]
@engine = Engine.find(engine_id)
@car.engine = @engine
@car.save
end
3.2.Измените EngineController # update
def update
respond_to do |format|
if @car.update(car_params)
format.html { redirect_to @car, notice: 'Car was successfully updated.' }
format.json { render :show, status: :ok, location: @car }
else
format.html { render :edit }
format.json { render json: @car.errors, status: :unprocessable_entity }
end
end
end
на
def update
respond_to do |format|
if set_engine && @car.update(car_params)
format.html { redirect_to @car, notice: 'Car was successfully updated.' }
format.json { render :show, status: :ok, location: @car }
else
format.html { render :edit }
format.json { render json: @car.errors, status: :unprocessable_entity }
end
end
end