Forum: Rails France habtm

8409a3c0fc353e58aa8c8f91cafd3c93?d=identicon&s=25 Patrice Cartier (kinggordo)
on 2010-10-01 14:21
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' ) %>
<div>
<%= 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
%>

</div>
<div id="<%= fonction.id %>" style="display:none;" >
<div id="perso">
<% for personnage in personnage.find(:all, :order =>'titre ASC' ) %>
<div>
<%= check_box_tag "film[personnage_ids][]", personnage.id,
@film.personnages.include?(personnage) %>
<%= personnage.titre %>

</div>
<% end -%>
</div>
</div>

<% 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
059ed46172a087063ce26250e44c8627?d=identicon&s=25 Fernando Perez (fernando)
on 2010-10-02 20:21
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
8409a3c0fc353e58aa8c8f91cafd3c93?d=identicon&s=25 Patrice Cartier (kinggordo)
on 2010-10-06 12:29
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| %>

  <span>
  <%= link_to_function(perso.titre)  do |page|
    page.visual_effect :toggle_blind, "#{perso.id}"
    end
  %>
  </span>


  <div id="<%= perso.id %>" style="display:none;" >
  <% Fonction.find(:all,:order=>"titre").each do |fonction| %>
    <br />
    <% f.fields_for :joints, Joint.new(:personnage_id => perso.id) do
|ff| %>
      <%= ff.hidden_field :personnage_id %>
      <%= ff.check_box :fonction_id, {}, fonction.id %>
      <span><%= fonction.titre %></span>


    <% end %>
    <br />
  <% end %>
  <br />
  </div>
<% end %>

par contre, je n'arrive pas à l'éditer correctement...

une idée ?

merci
586596d987f2acf793c0ce841b765adb?d=identicon&s=25 Solrac Caritas (caritas)
on 2010-10-06 13:11
>   <div id="<%= perso.id %>" style="display:none;" >
>   <% Fonction.find(:all,:order=>"titre").each do |fonction| %>
>     <br />
>     <% f.fields_for :joints, Joint.new(:personnage_id => perso.id) do
> |ff| %>
>       <%= ff.hidden_field :personnage_id %>
>       <%= ff.check_box :fonction_id, {}, fonction.id %>
>       <span><%= fonction.titre %></span>


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?
8409a3c0fc353e58aa8c8f91cafd3c93?d=identicon&s=25 Patrice Cartier (kinggordo)
on 2010-10-06 13:18
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…
This topic is locked and can not be replied to.