Абсолютно застрял, пытаясь создать вложенную ассоциацию в форме рельсов с помощью has_many через
Я опубликовал предыдущий вопрос об этом, и мне посоветовали прочитать много соответствующей информации. Я прочитал его и попытался реализовать около 30 различных решений. Ни один из которых не работал для меня.
Вот'что ямы получили
У меня есть модель Miniatures. У меня есть модель производителя. У миниатюр есть много производителей ЧЕРЕЗ модель Productions.
Кажется, что ассоциации установлены правильно, так как я могу показать их в своих представлениях и создать их через консоль. Проблема в том, что я разрешаю представлениям Miniatures NEW и EDIT создавать и обновлять таблицу Productions.
В консоли команда@miniature.productions.create(manufacturer_id: 1)
работает, что приводит меня к мысли, что я должен быть в состоянии сделать то же самое в форме.
Я ДУМАЮ, что моя проблема всегда в контроллере Miniatures и, в частности, в функции CREATE. Я испробовал там множество решений других людей, и никто не добился цели. Также возможно, что мой field_for материал в моей форме неправильный, но это кажется менее рискованным.
Я застрял на этом в течение нескольких дней, и хотя есть и другие вещи, над которыми я мог бы поработать, если эта ассоциация нетогда я могуМне нужно переосмыслить всю мою заявку.
Форма теперь создает строку в таблице Productions, но неt включает все важные factory_id.
Любая помощь очень ценится.
Моя новая миниатюрная форма
Add a miniature
Date.current.year, :end_year => 1970, :include_blank => true %>
Контроллер миниатюр
class MiniaturesController < ApplicationController
before_action :signed_in_user, only: [:new, :create, :edit, :update]
before_action :admin_user, only: :destroy
def productions
@production = @miniature.productions
end
def show
@miniature = Miniature.find(params[:id])
end
def new
@miniature = Miniature.new
end
def edit
@miniature = Miniature.find(params[:id])
end
def update
@miniature = Miniature.find(params[:id])
if @miniature.update_attributes(miniature_params)
flash[:success] = "Miniature updated"
redirect_to @miniature
else
render 'edit'
end
end
def index
@miniatures = Miniature.paginate(page: params[:page])
end
def create
@miniature = Miniature.new(miniature_params)
if @miniature.save
@production = @miniature.productions.create
redirect_to @miniature
else
render 'new'
end
end
def destroy
Miniature.find(params[:id]).destroy
flash[:success] = "Miniature destroyed."
redirect_to miniatures_url
end
private
def miniature_params
params.require(:miniature).permit(:name, :release_date, :material, :scale, :production, :production_attributes)
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
end
Миниатюрная модель
class Miniature < ActiveRecord::Base
has_many :productions, dependent: :destroy
has_many :manufacturers, :through => :productions
accepts_nested_attributes_for :productions
validates :name, presence: true, length: { maximum: 50 }
validates :material, presence: true
validates :scale, presence: true
validates_date :release_date, :allow_blank => true
def name=(s)
super s.titleize
end
end
Производственная модель
class Production < ActiveRecord::Base
belongs_to :miniature
belongs_to :manufacturer
end
Модель производителя
class Manufacturer < ActiveRecord::Base
has_many :productions
has_many :miniatures, :through => :productions
validates :name, presence: true, length: { maximum: 50 }
accepts_nested_attributes_for :productions
end