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.
Vous devez vous connecter pour publier un commentaire.
Au lieu de l'appeler:
Essayer de Rails pour "construire" la méthode:
À l'aide de la méthode build utilise ActiveRecord de l'Association de sauvegarde automatique de la fonctionnalité.
Voir http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html
Vous devez également mettre à jour vos paramètres de méthode, par exemple
Également votre fields_for devrait être au pluriel (je pense)...
production_attributes
dans la miniature params permis de méthode au lieu de simplementproductions
... voir la dernière modificationproductions
pluriel dans le fields_for. Je pense que ses quelques petits problème qui nous manque... Peut-être le select n'est pas correctement formé ou quelque chose. Vous pouvez essayer de remplacer le sélectionner :manufacturer_id avec un number_field et il suffit de taper l'identifiant et voir ce que vous obtenez. Aussi, avez-vous examiné le guide Rails, guides.rubyonrails.org/form_helpers.html#building-complex-forms. Si tout le reste échoue, peut-être poster un Résumé de votre contrôleur et de points de vue et je vais travailler dans le ventre. Nous nous efforçons de rendre cela plus difficile qu'il doit être quelque part le long de la ligne.@miniature = Miniature.new
devait être suivie par,@miniature.productions.build
... Voir la dernière modification