Absolument coincé à essayer de créer des listes de l'association dans les rails forme avec has_many par

J'ai posté une question précédente à ce sujet et a conseillé de lire beaucoup d'informations pertinentes. Je l'ai lu et essayé de mise en œuvre environ 30 différentes solutions. Aucun n'a fonctionné pour moi.

Voici ce que j'ai.

J'ai Figurines modèle.
J'ai un fabricant du modèle.
Les Miniatures ont de nombreux fabricants à TRAVERS un modèle Productions.

Associations semblent être correctement configuré que je peux montrer à mes points de vue et les créer via la console. Où j'ai un problème, c'est de laisser les Miniatures de création et de modification des vues de créer et mettre à jour les Productions de la table.

Dans la console la commande @miniature.productions.create(manufacturer_id: 1) œuvres, ce qui m'amène à croire que je devrais être capable de faire la même chose dans un formulaire.

Je PENSE que mon problème est toujours dans les Miniatures Contrôleur et plus précisément la fonction CREATE. J'ai essayé une tonne d'autres peuples solutions et aucun n'a fait le tour. Il est également possible que mon field_for trucs dans mon formulaire est mal, mais qui semble de moins en moins laborieux.

J'ai été coincé sur cela pendant des jours et alors qu'il ya d'autres choses que je pourrais travailler sur, si cette association n'est pas possible, alors j'aurais besoin de repenser l'ensemble de mon application.

La forme crée maintenant une ligne dans les Productions de la table, mais ne comprennent pas du tout important manufacturer_id.

Toute aide TRÈS appréciée.

Ma Nouvelle forme Miniature

<% 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>

Miniatures contrôleur

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

Modèle Miniature

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

Modèle de Production

class Production < ActiveRecord::Base
belongs_to :miniature
belongs_to :manufacturer
end

De modèle du fabricant

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
  • N'ai pas cette profondeur, mais vous avez un problème sur votre action de création où la relation est en train de construire sur @Miniature (avec un grand "m") au lieu de @miniature (en bas de casse " m " avec les matches de votre variable d'instance @miniature)...
  • Ah merci pour le spotting qui. J'ai corrigé ça et il l'a jeté un message d'erreur du genre "Impossible de créer jusqu'à si le parent est sauvé", donc je l'ai déplacé la ligne vers le bas au-dessous de la "si @miniature.enregistrer" de la ligne. Maintenant, il crée la ligne dans les Productions de la table, mais ne remplissez pas les manufacturer_id champ. J'ai été ici avant, malheureusement.
InformationsquelleAutor Ossie | 2013-10-07