Absolut festgefahren beim Versuch, mit has_many through eine verschachtelte Assoziation in Schienenform zu erstellen
Ich habe eine frühere Frage dazu gestellt und es wurde empfohlen, viele relevante Informationen zu lesen. Ich habe es gelesen und versucht, ungefähr 30 verschiedene Lösungen zu implementieren. Nichts davon hat für mich funktioniert.
Hier ist was ich habe.
Ich habe ein Miniaturmodell. Ich habe ein Herstellermodell. Miniaturen haben viele Hersteller durch ein Productions-Modell.
Die Verknüpfungen scheinen korrekt eingerichtet zu sein, da ich sie in meinen Ansichten anzeigen und über die Konsole erstellen kann. Ich habe ein Problem damit, dass die Ansichten "Miniaturen NEU" und "BEARBEITEN" erstellt und in der Tabelle "Produktionen" aktualisiert werden.
In der Konsole den Befehl@miniature.productions.create(manufacturer_id: 1)
funktioniert, was mich zu der Überzeugung bringt, dass ich in der Lage sein sollte, dasselbe in einer Form zu tun.
Ich denke, mein Problem liegt immer im Miniatures Controller und speziell in der CREATE-Funktion. Ich habe dort eine Menge anderer Leute ausprobiert und keine hat den Trick getan. Es ist auch möglich, dass mein field_for-Zeug in meinem Formular falsch ist, aber das scheint weniger umständlich zu sein.
Ich bin schon seit Tagen dabei und obwohl es noch andere Dinge gibt, an denen ich arbeiten könnte, müsste ich meine gesamte Bewerbung überdenken, wenn diese Zuordnung nicht möglich ist.
Das Formular erstellt jetzt eine Zeile in der Productions-Tabelle, enthält jedoch nicht die alle wichtigen manufacturer_id.
Jede Hilfe sehr geschätzt.
Meine neue Miniaturform
<% 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>
Miniaturen-Controller
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
Miniaturmodell
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
Serienmodell
class Production < ActiveRecord::Base
belongs_to :miniature
belongs_to :manufacturer
end
Herstellermodell
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