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!
Explique ton cas d'utilisation et donne du code si tu en as.
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.
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 tade
belongs_to :user
attr_accessor tade_name
validates_presence_of :name, :manager_name, :city_name, tade_name, :color1, :color2
validates tade_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][tade_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 tade_name %>
<%= f.text_field tade_name %>
<% if !@team.errors[tade_name].empty? %> <span class='error_message'><ul>
<% @team.errors[tade_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
En court, il faut que tu utilises
fields_for.
- 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.
Meme en débutant, Simple-Form est super simple à mettre en place
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.