Habtm


#1

Bonjour!

Je souhaite enregistrer via un seul formulaire ( film ) Ã l’aide de
checkoxes plusieurs modèles reliés entre eux.
les fonctions et personnages sont au préalables créés.

un film à plusieurs fonctions qui ont elles mêmes plusieurs personnages

model film:

has_many :film_fonctions, :dependent => :destroy
has_many :fonctions, :through => :film_fonctions

has_many :film_personnages, :dependent => :destroy
has_many :personnages, :through => :film_personnages

model fonction:

has_many :fonction_personnages, :dependent => :destroy
has_many :personnages, :through => :fonction_personnages

dans ma vue views/films/_form ( new et edit ):

<% for fonction in fonction.find(:all, :order =>‘titre ASC’ ) %>

<%= check_box_tag "film[fonction_ids][]", fonction.id, @film.fonctions.include?(fonction) %> <%= link_to_function(fonction.titre) do |page| page.visual_effect :toggle_blind, "#{fonction.id}" end %>
<% for personnage in personnage.find(:all, :order =>'titre ASC' ) %>
<%= check_box_tag "film[personnage_ids][]", personnage.id, @film.personnages.include?(personnage) %> <%= personnage.titre %>
<% end -%>

<% end -%>

dans le controller films:

def create
@film = Film.new(params[:film])

@film.fonctions = Fonction.find(params[:fonction_ids]) if

params[:fonction_ids]
@tfilm.personnages = Personnage.find(params[:personnage_ids]) if
params[:personnage_ids]
if @film.save

    redirect_to admin_films_url

  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @film.errors, :status =>

:unprocessable_entity }
end

end

routes:

map.resources :films, :collection => {:admin=>:get,:live_search =>:get}
do |film|
film.resources :fonctions, :collection => {:admin=>:get} do
|fonction|
fonction.resources :personnages, :collection => {:admin=>:get}
end
end

tout s’enregistre correctement dans la table film_fonctions et
film_personnages mais toujours pas dans fonction_personnages

Donc lorsque j’enregistre les personnages c’est par rapport au film et
non aux fonctions.

Comment puis-je piloter la table fonction_personnages depuis le
controller film ?

Quelle est la solution la plus simple ?

Merci !

Patrice


#2

Si j’ai bien compris ce que tu souhaites faire, dans ton model il te
faut ajouter un accepts_nested_attributes_for et dans ta view utiliser
fields_for. Je te laisse chercher des infos sur ça pour l’adapter à ton
problème.

Attention ton code est à revoir, il y a des choses sales qui trainent.

http://digiprof.tv


#3

j’ai trouvé comment enregistrer correctement mes donnéées:

j’ai donc 3 tables film/fonction/personnage

et une table de jointure: joint

le tout avec fields_for et accepts_nested_attributes_for

dans ma vue (views/films/_form):

<% Personnage.find(:all,:order=>“titre”).each do |perso| %>

<%= link_to_function(perso.titre) do |page| page.visual_effect :toggle_blind, "#{perso.id}" end %>
<% Fonction.find(:all,:order=>"titre").each do |fonction| %>
<% f.fields_for :joints, Joint.new(:personnage_id => perso.id) do |ff| %> <%= ff.hidden_field :personnage_id %> <%= ff.check_box :fonction_id, {}, fonction.id %> <%= fonction.titre %>
<% end %>
<br />

<% end %>

<% end %>

par contre, je n’arrive pas à l’éditer correctement…

une idée ?

merci


#4
<% Fonction.find(:all,:order=>"titre").each do |fonction| %>
<% f.fields_for :joints, Joint.new(:personnage_id => perso.id) do |ff| %> <%= ff.hidden_field :personnage_id %> <%= ff.check_box :fonction_id, {}, fonction.id %> <%= fonction.titre %>

je ne sais pas si le probleme vient de la mais:

d’ou vient le “f” de <% f.fields_for , ne serait ce pas “fonction”
plutot?


#5

le f vient de:

<% form_for @film, :url=>chiratfilms_url, :html => { :multipart => true}
do |f| %>

puisque tout est controllé depuis le model film

donc là , je suis dans le partial _form pour “new” et “edit”

dans ma table joint j’ai:

film_id
fonction_id
personnage_id

l’idée étant d’enregistrer pour un film, plusieurs fonctions qui elles
même ont plusieurs personnages.

Mais aucune idée au niveau de l’update…