Absolutamente preso tentando criar associação aninhada em forma de trilhos com has_many através de
Eu postei uma pergunta anterior sobre isso e fui aconselhado a ler muitas informações relevantes. Eu li e tentei implementar cerca de 30 soluções diferentes. Nenhum dos quais funcionou para mim.
Aqui está o que tenho.
Eu tenho um modelo de miniaturas. Eu tenho um modelo de fabricantes. Miniaturas têm muitos fabricantes através de um modelo de produção.
As associações parecem estar configuradas corretamente, pois posso mostrá-las em minhas visualizações e criá-las pelo console. Onde eu tenho um problema é deixar as visualizações Miniatures NEW e EDIT criar e atualizar para a tabela Productions.
No console, o comando@miniature.productions.create(manufacturer_id: 1)
funciona, o que me leva a acreditar que eu deveria ser capaz de fazer o mesmo de uma forma.
Eu acho que o meu problema está sempre no controlador de miniaturas e, especificamente, a função CREATE. Eu tentei uma tonelada de soluções de outros povos lá e nenhum fez o truque. Também é possível que meu campo_ para coisas em minha forma esteja errado, mas isso parece menos complicado.
Eu estive preso nisso por dias e enquanto há outras coisas que eu poderia trabalhar, se essa associação não for possível, então eu preciso repensar meu aplicativo inteiro.
O formulário agora cria uma linha na tabela Productions, mas não inclui o importante manufacturer_id.
Qualquer ajuda muito apreciada.
Minha nova forma em miniatura
<% provide(:title, 'Add miniature') %>
<h1>Add a miniature</h1>
<div class="row">
<div class="span6 offset3">
<%= form_for(@miniature) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :production do |production_fields| %>
<%= production_fields.label :manufacturer_id, "Manufacturer" %>
<%= production_fields.select :manufacturer_id, options_from_collection_for_select(Manufacturer.all, :id, :name) %>
<% end %>
<%= f.label :release_date %>
<%= f.date_select :release_date, :start_year => Date.current.year, :end_year => 1970, :include_blank => true %>
<%= f.submit "Add miniature", class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>
Controlador de miniaturas
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
Modelo em miniatura
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
Modelo de produção
class Production < ActiveRecord::Base
belongs_to :miniature
belongs_to :manufacturer
end
Modelo do fabricante
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