Ouverture de session

Commentaires récents

Syndication
Flux XML

[Formulaire] des données ne sont pas enregistrée

[Formulaire] des données ne sont pas enregistrée
Posté par Alex.Filipetti le Vendredi, 29 Mai, 2009 - 9:24pm. Développement

Bonjour, je suis novice en Rails. Et je bloque sur un problème depuis hier matin sans vraiment rien arriver à corriger.

je vais essayer de décrire le mieux possible.

voici les deux tables concernées directement copié dans shema.rb

les champs qui m'intéresse plus particulièrement sont dossier_id et type dans la table postes.

Quote:
create_table "dossiers", :force => true do |t|
t.string "code"
t.string "intitule"
t.integer "utilisateur_id"
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "postes", :force => true do |t|
t.string "code"
t.string "intitule"
t.string "numPiece"
t.date "date"
t.string "type"
t.datetime "created_at"
t.datetime "updated_at"
t.float "soldeInitial", :default => 0.0
t.integer "dossier_id"
end

dans mon formulaire je fais une liste déroulante des dossiers auquels l'utilisateur a accès. elle dépends directement de la session utilisateur.

bref je ne sais pas pourquoi ni les types ni les dossiers ne sont enregistrés lorsque je crée un nouveau poste... :'(

postes_controller.rb (juste les méthodes concernée):

Quote:
# GET /postes/new
# GET /postes/new.xml
def new
@poste = Poste.new

respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @poste }
end
end

# POST /postes
# POST /postes.xml
def create
@poste = Poste.new(params[:poste])

respond_to do |format|
if @poste.save
flash[:notice] = 'Poste was successfully created.'
format.html { redirect_to(@poste) }
format.xml { render :xml => @poste, :status => :created, :location => @poste }
else
format.html { render :action => "new" }
format.xml { render :xml => @poste.errors, :status => :unprocessable_entity }
end
end
end

dans app/views/postes/new.html.erb

Quote:
Nouveau Poste

"intitule", :conditions => ["utilisateur_id =?", session[:user ].id] ).map { |u| [u.intitule] } %>
true} %>



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
Premiere piste
Auteur: 
sebalyans
Date: 
Mar, 02/06/2009 - 09:38

Le nom de colonne "Type" est a proscrire...

Pour le reste, l'idéal serait d'avoir plus d'infos sur ta vue.

+
Seb


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
visiblement la fin n'est pas
Auteur: 
Alex.Filipetti
Date: 
Ven, 29/05/2009 - 21:42

bon j'ai un problème pour faire passer ce morceau de code, surement du a des balises mais je dois vraiment y aller

dans app/views/postes/new.html.erb

Quote:

"intitule", :conditions => ["utilisateur_id =?", session[:user ].id] ).map { |u| [u.intitule] } %>
true} %>

voila la fin, je remerci par avance ceux qui passeront dans le coin.
bon W-E à tout le monde évidement, j'essaie de passer le plus régulièrement possible ici mais boulot oblige j'aurai quelques absences.

merci d'avance.
Alex


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
simplifier
Auteur: 
mizoutch
Date: 
Mar, 02/06/2009 - 16:08

1- Avant de comprendre le problème, je te conseille d'abord d'essayer d'utiliser le concept MVC de Rails, c'est à dire de générer la liste déroulante dans le controleur avec ta requète et non dans la vue, ça va alléger ton code dans la vue et peut être trouver rapidement la source de ton problème.

2- J'ai l'impression qu'il manque du code dans les lignes de ton dernier message.

3- Peux-tu nous renseigner sur la relation de tes tables dans les fichier Model ?

4- L'utilisateur comporte deux état ? (session / pas de session), ou bien, chaque utilisateur à ces propres dossiers ?

Merci!


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
@seb : merci pour le nom de
Auteur: 
Alex.Filipetti
Date: 
Mar, 02/06/2009 - 17:14

@seb : merci pour le nom de collone type.

@mizoutch :
1- je vais voir ce que je peux faire pour générer la liste dans le controleur ca me semble plus sencé que ce que j'ai fait pour le moment.

2- en effet il manque du code dans la fin du premier message et dans le second (qui tentais de reprendre ce manque) je ne comprends pas il ne s'affiche pas... peux être un problème du à une balise ou autre... je ne sais pas...

3- un dossier a plusieurs postes et un utilisateur
un poste à un unique dossier
un utilisateur a pluseurs dossiers

4- chaque utilisateur possède ses propres dossiers.

voici le code qui ne passait pas, j'ai du retirer les balises ouvrantes correspondant à celles ci %>, car elle empéchaient l'affichage du reste de la ligne. je les ai remplacé par des ?
(pas dans mon code originel évidement)

Quote:

?= f.label :Dossier %>
? @d = Dossier.find(:all, :order => "intitule", :conditions => ["utilisateur_id =?", session[:user ].id] ).map { |u| [u.intitule] } %>
?= f.select :dossier_id, @d, {:include_blank => true} %>

merci pour vos conseils. j'applique et je reviens demain matin avec du neuf.

cordialement,
Alex


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
simplifier 2
Auteur: 
mizoutch
Date: 
Mer, 03/06/2009 - 13:48

on utilise les modèles sous Rails pour éviter d'utiliser ce genre de requete, j'ai l'impression de voir du PHP camouflé sous Rails :D
il suffit d'éditer tes fichiers dans le répertoire "modeles"

class Dossier < ActiveRecord::Base
belongs_to : user
end
class User < ActiveRecord::Base
has_many :dossiers
end

et d'utilise les requetes du genre

@user = User.find(session[:user ].id])
@dossiers = @user.dossiers

il est recommandé d'utilise le "s" du pluriel dans les noms des instances de resultats, c'est plus visible et nous donne rapidement une idée sur le résultat de sorti.

Même si il te semble que 4 lignes de code dans une "vue" c'est plus rapide que d'éditer deux fichiers dans les "Models" et un autre dans le Controlleur. L'évolution de ton programme sera plus difficile à maintenir et à changer par la suite.
sans oublier que tes futurs requêtes seront plus simple avec l'ActiveRecord

exemple :
le cas ou tu veux supprimer un User, il te faut une autre requetes pour supprimer ces propre dossiers. Par contre dans le modèle il suffit d'utiliser dans le modele user:

has_many :dossiers, :dependent => :destroy

plutot

has_many :dossiers, :dependent => :destroy, :order => 'intitule ASC'

pour respecter ta requête

La suppression de l'User engendre automatiquement la suppression de ces dossiers.

Revenant à ton problème :
Je suis un peu perdu par rapport aux noms des champs de tes tables.

Normalement quand il y a un "dossier_id", d'après la nomination sous Rails ce champs se trouve dans la table Users, et celà implique qu'un Dossier à plusieurs Utilisateurs, ce qui n'est pas compatible avec tes besoins:

4- chaque utilisateur possède ses propres dossiers.

La clé primaire d'une simple table sous Rails porte toujours le nom "id"


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
rebonjour, désolé de ne
Auteur: 
Alex.Filipetti
Date: 
Mer, 03/06/2009 - 14:10

rebonjour,
désolé de ne passer que maintenant j'ai eu un bon gros contretemps et impossible de me pencher sur le problème.

pour le champ "dossier_id" il se trouve dans la table Postes impliquant en effet qu'un Dossier a plusieurs Potes.

pour les "Utilisateurs" j'ai un champ utilisateur_id dans la table Dossiers.

je me penche sur les modif à faire, j'y vois déjà beaucoup plus clair avec tes explications.
merci beaucoup.

je repasse dès que j'ai corrigé ca.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
me revoila. alors premier
Auteur: 
Alex.Filipetti
Date: 
Mer, 03/06/2009 - 18:34

me revoila.

alors premier point (le plus facile) j'ai remplacé type par typ et il fonctionne normalement. ==> affaire classée
et merci.

j'ai mis à jour mes models.

rajouté ceci dans mon postes_controller.rb

Quote:
@poste = Poste.find(params[:id])
@user = Utilisateur.find(session[:user ].id)

et voici le code (vachement simplifié du coup) de ma vue :
app/views/postes/new.html.erb
(j'ai remplacé les "< %" par des "?" comme précédenment)

Quote:

?= f.label :Dossier %>
?= f.select :dossier_id, @dossiers, {:include_blank => true} %>

donc ca à l'air de marcher mais le seul truc c'est que je me vois proposer des # dans ma liste déroulante au lieu de me voir proposer les intitule de mes dossiers.

j'ai essayé de mettre @dossiers.intitule ou @dossier[intitule] mais ca ne marche évidement pas.

dois-je créer un getter sur mes intitule ou autre?
j'avoue ne pas trop savoir....

désolé de poser ce genre de questions de débutant... je continue de chercher et repasse si je trouve.

merci encore de ton aide.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
si tu reprends ton premier
Auteur: 
mizoutch
Date: 
Ven, 05/06/2009 - 21:51

si tu reprends ton premier code tu verras un truc comme :

% @d = Dossier.find(:all, :order => "intitule", :conditions => ["utilisateur_id =?", session[:user ].id] ).map { |u| [u.intitule] } %>

la première partie


@d = Dossier.find(:all, :order => "intitule", :conditions => ["utilisateur_id =?", session[:user ].id] )

est la requête que t'as replacé dans le controlleur qui sort toute les lignes de résultat avec tout les champs (attribut)

@d.intitule nouvellement @dossiers.intitule, ne veux rien dire, parce que @dossiers regroupe tout les résultats, si par contre @d(ou @dossiers) était un résultat unique ça aura marché.(pas tout à fait, c'est expliqué ci-dessous)

la méthode .map (vive l'objet!!) récupére l'id et l'intitule de chaque ligne de la requête pour en faire un tableau à deux dimension qui ressemble à [ [intitule1,1] , [intitule2,2] , ... ]

D'ailleurs ton premier code est erroné, il lui manque le deuxième attribut, l'identificateur "id"

.map { |u| [u.intitule] }...

Voici la correction :

%= f.label :Dossier %>
% @tableau_dossier = @dossiers.map { |d| [d.intitule, d.id] } %>
%= f.select(:dossier_id, @tableau_dossier, {:include_blank => true}) %>

ici d c'est comme une variable d'une boucle "for d=..."

{:prompt => 'Selectionner un dossier'} est un autre attribut que tu peux rajouter entre les parenthése de "select".

de là, je pense que tu comprends pourquoi on rajoute des "s" dans la nomination de certaines instances dans le code.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
merci
Auteur: 
Alex.Filipetti
Date: 
Lun, 08/06/2009 - 12:43

Maintenant tout semble marcher parfaitement.

Je tiens vraiment à te remercier, tu m'a enlevé une grosse épine du pied, mis le doigt sur mes erreurs, et en plus rajouté moult explications, qui m'ont permis de mieux appréhender rails.

Des réponses très complètes et rapidement après ma demande d'aide... que demander de plus?

vraiment merci à toi.

cordialement,
Alex


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
vive les vacances
Auteur: 
mizoutch
Date: 
Lun, 08/06/2009 - 13:14

ça fait plaisir, le livre "Ruby on Rails" 2eme edition d'Eyrolles reste une très bonne référence à lire et à relire pour les francophones. Même s'il parait être dépassé par Rails2, les bases restent les mêmes. Sans oublier d'avoir un petit memento de Ruby sous la main.
Sinon améliorer son anglais en surfant dans les forums outre-mer


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Qui est en ligne
Il y a actuellement 1 utilisateur et 29 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Propulsé par Drupal ]