JeuWeb - Crée ton jeu par navigateur
[Résolu][Rails] Validation de 2 models dans un seul formulaire - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][Rails] Validation de 2 models dans un seul formulaire (/showthread.php?tid=5690)



[Résolu][Rails] Validation de 2 models dans un seul formulaire - popayan - 16-09-2011

Bonjour,

Quelqu'un aurait un exemple de comment gérer dans le controller la validation de 2 models initialisés dans un seul formulaire en 3.1?

je sais comment créer le formulaire et sauvegarder les models mais au niveau de la validation je fais une bidouille qui ne me plais pas et donc j'aimerais avoir vos méthodes? Pour info, je dois récupérer l'id d'un des 2 models pour l'injecter dans l'autre

merci d'avance!


RE: [Rails] Validation de 2 models dans un seul formulaire - Sephi-Chan - 16-09-2011

Explique ton cas d'utilisation et donne du code si tu en as. Smile Ton approche est probablement mauvaise dans le sens où tu n'as sûrement pas besoin de faire ce que tu fais.

N'hésite pas à donner systématiquement les détails et le code dès le premier, ça nous évite de te tirer les vers du nez. Wink


RE: [Rails] Validation de 2 models dans un seul formulaire - popayan - 16-09-2011

on va dire que tu as un modèle Club et un modèle Stade avec une relation entre les 2.
le joueur a besoin de renseigner plusieurs choses concernant son club (son nom, sa ville, les couleurs, l'emblème...) et son stade (juste le nom dans un premier temps), j'ai donc voulu regrouper le formulaire de création dans un seul, celui du club. Donc le code (en version light) :


#Le modèle
class Club < ActiveRecord::Base

belongs_to Confusedtade
belongs_to :user

attr_accessor Confusedtade_name

validates_presence_of :name, :manager_name, :city_name, Confusedtade_name, :color1, :color2

validates Confusedtade_name, :length => { :in => 5..30 }
end

#Le controller
class ClubsController < ApplicationController

def new
@team = Team.new
end

def create

params[:team][:user_id] = current_user.id

@team = Team.new params[:team]
@team.stade_id = Stade.create(:name => params[:team][Confusedtade_name])
if @team.save
redirect_to team_path
else
render "new"
end
end
end


#La vue
<%= form_for @team do |f| %>
<p><%= f.label :name %>
<%= f.text_field :name %>
<% if !@team.errors[:name].empty? %> <span class='error_message'><ul>
<% @team.errors[:name].each do |msg| %>
<li><%= msg %></li>
<% end %></ul></span>
<% end %>
</p>
...
<p><%= f.label Confusedtade_name %>
<%= f.text_field Confusedtade_name %>
<% if !@team.errors[Confusedtade_name].empty? %> <span class='error_message'><ul>
<% @team.errors[Confusedtade_name].each do |msg| %>
<li><%= msg %></li>
<% end %></ul></span>
<% end %>
</p>
<label for="color1">Color 1</label>
<input id="team_color1" name="team[color1]" type="text" value="#FFFFFF" /></p>
<%= f.submit "Create" %>
<% end %>

voila, y a surement du mauvais, mais je suis là pour apprendre Big Grin





RE: [Rails] Validation de 2 models dans un seul formulaire - Sephi-Chan - 16-09-2011

En court, il faut que tu utilises fields_for. Smile


- form_for @team do |f|
%p
= f.label :name
= f.text_field :name

- f.fields_for @team.stade |ff|
%p
= ff.label :name
= ff.text_field :name

%p
= ff.label :color
= ff.text_field :color

À côté de ça, je te recommande d'utiliser Haml dans tes vues et de déplacer ton code pour afficher les messages d'erreurs dans un helper. Et quand tu seras plus mûr avec Rails, je te conseille de faire tes formulaires avec simple_form.


RE: [Rails] Validation de 2 models dans un seul formulaire - Viciousity - 16-09-2011

Meme en débutant, Simple-Form est super simple à mettre en place Smile


RE: [Rails] Validation de 2 models dans un seul formulaire - Sephi-Chan - 17-09-2011

Mais ça ne lui apprendrais pas à utiliser l'API de Rails pour les formulaires.
Mieux vaut éviter de débuter avec une abstraction de l'abstraction. Wink