De l'AJAX dans un formulaire

Bonjour,
Je travaille avec Ruby on rails.
Dans mon application j’ai un formulaire ou je demande de rentrer
l’adresse e-mail. Cependant j’ai besoin de donner la possibilité de
rentrer plusieurs adresses e-mail sans restriction de nombre. Donc j’ai
créé un bouton qui a base d’AJAX ajoute un nouveau champ pour rentrer
une nouvelle adresse. Mon problème est que si l’une des adresses est
erronée j’ai un message d’erreur (celui générée automatiquement par
rails après mon Validates_on_format dans mon modèle) mais sur la page
qui s’affiche il n’y a qu’un champ d’adresse même s’il y en avait
plusieurs avant. De plus ce champ est vide alors que les autres champs
(nom, numéro de téléphone…) reste avec les valeurs qui avaient été
rentré avant l’erreur de validation.
Mon code:
dans mon formulaire.rhtml j’ai:

Nom
<%= text_field 'profil', 'nom' %>

Numéro de Téléphone
<%= text_area 'profil', 'téléphone' %>

Email

'/> <%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %>
<% render :partial => "ajout_emails" %>
Dans mon controller: def ajout_emails session[:nombre_emails] = session[:nombre_emails]? session[:nombre_emails]+1 : 1 @nombre_emails=session[:nombre_emails] render :partial => "ajout_emails" end

def new
session[:nombre_emails]=nil
end

def create
@profile = Profile.new(:title=>params[:profile][:nom],
:description=>params[:profile][:telephone]
)
number_of_emails = session[:number_of_emails]?
session[:number_of_emails].to_i : 0
for i in 0…nombre_emails
@profile.source<<Source.new(:email=>params[‘email_’+i.to_s])
end
if @idea.save
flash[:notice] = ‘Profile bien sauve.’
redirect_to :action => ‘menu’
else
session[:nombre_emails]=0
render :action => ‘new’
end
end
dans mon _ajout_email.rhtml:

<%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %> Merci pour votre aide

Raph :

  flash[:notice] = 'Profile bien sauve.'

J’ai parcouru ton message très rapidement et une première
analyse très succinte bloque sur le code de ton action create :

C’est quoi ce @idea.save ?? erreur de copier/coller ?

la relation entre Profile et Idea ?
@idea initialisé dans un before_filter ?

qq remarques rapides :
0.upto(nombre_emails) do |i|
est plus idiomatique ruby.

@profile.sources.build(:email => params[“email_#{i}”])

il manque pas un s ?

-- Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Jean-François Trân wrote:

C’est quoi ce @idea.save ?? erreur de copier/coller ?

la relation entre Profile et Idea ?
@idea initialis� dans un before_filter ?

Oui désolé j’ai oublié de changer cet Idea. En fait “Idea” est a
remplacé par “Profile”. Idea=Profile.

qq remarques rapides :
0.upto(nombre_emails) do |i|
est plus idiomatique Ruby.

Merci pour le conseil

@profile.sources.build(:email => params[“email_#{i}”])

il manque pas un s ?

Je ne vois pas ou tu vois cette ligne dans mon code, de toute façon mon
code marche plutôt bien enfin a première vu et quelques tests sont vert
aussi. Merci

Sinon a propos de réafficher les adresses emails rentrées?

Merci

Raph :

C’est quoi ce @idea.save ?? erreur de copier/coller ?

la relation entre Profile et Idea ?
@idea initialis� dans un before_filter ?

Oui désolé j’ai oublié de changer cet Idea. En fait “Idea” est a
remplacé par “Profile”. Idea=Profile.

T’as oublié de le changer en préparant le copier-coller ?

qq remarques rapides :
0.upto(nombre_emails) do |i|
est plus idiomatique Ruby.

Merci pour le conseil

@profile.sources.build(:email => params[“email_#{i}”])

il manque pas un s ?

Je ne vois pas ou tu vois cette ligne dans mon code,

C’est parce que j’ai sauté une étape :

à la place de
@profile.source<<Source.new(:email=>params[‘email_’+i.to_s])
ce serait pas mieux ? …

(il ne manque pas un s ? problème de copier-coller ?)

de toute façon mon code marche plutôt bien

plutôt bien donc.

enfin a première vu

ah.

et quelques tests sont vert aussi. Merci

quelques tests. Je ne sais pas lesquels et s’ils sont en relation
avec le code que tu as copier-coller, mais je vais te dire ouais.

S’ils sont verts, tant mieux.

Remarque on peut aussi comprendre que “tous mes tests
ne passent pas”.

Je sais pas pour les autres, mais moi je suis dans le flou.

Sinon a propos de réafficher les adresses emails rentrées?

Ben déjà , je voudrais bien qu’on règle ces problèmes de copier/coller
avant d’analyser ce qui ne va pas dans ton code. Par exemple
pourquoi t’as un session[:number_of_emails] alors que partout
ailleurs tu utilises session[:nombre_emails] ?

T’as oublié de le changer en préparant le copier-coller ?
Et pourquoi tu dois le changer pour préparer le copier-coller ?

Pour l’instant, je comprends rien.

РJean-Fran̤ois.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Jean-François Trân wrote:

de toute façon mon code marche plutôt bien

plutôt bien donc.

enfin a première vu

ah.

et quelques tests sont vert aussi. Merci

quelques tests. Je ne sais pas lesquels et s’ils sont en relation
avec le code que tu as copier-coller, mais je vais te dire ouais.

S’ils sont verts, tant mieux.

J’ai écrit plein de tests, functional tests et unit tests et même
certain selenium tests et ils passent tous.

Remarque on peut aussi comprendre que “tous mes tests
ne passent pas”.

Je sais pas pour les autres, mais moi je suis dans le flou.

Sinon a propos de réafficher les adresses emails rentrées?

Ben déjà , je voudrais bien qu’on règle ces problèmes de copier/coller
avant d’analyser ce qui ne va pas dans ton code. Par exemple
pourquoi t’as un session[:number_of_emails] alors que partout
ailleurs tu utilises session[:nombre_emails] ?

T’as oublié de le changer en préparant le copier-coller ?
Et pourquoi tu dois le changer pour préparer le copier-coller ?

Pour l’instant, je comprends rien.

Ouai je vois. Normal. En fait pour tout dire je fait ce projet pour mon
boulot et j’ai changé les noms pour les mettre en français premièrement
et pour ne pas dévoiler d’informations confidentielles.
Je vais m’appliquer cette fois ci en copiant le code et en changeant les
noms:

Nom
<%= text_field 'profil', 'nom' %>

Numéro de Téléphone
<%= text_area 'profil', 'telephone' %>

Email

'/> <%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %>
<% render :partial => "ajout_emails" %>
Dans mon controller: def ajout_emails session[:nombre_emails] = session[:nombre_emails]? session[:nombre_emails]+1 : 1 @nombre_emails=session[:nombre_emails] render :partial => "ajout_emails" end

def new
session[:nombre_emails]=nil
end

def create
@profile = Profile.new(:title=>params[:profile][:nom],
:description=>params[:profile][:telephone]
)
nombre_emails = session[:nombre_emails]?
session[:nombre_emails].to_i : 0
for i in 0…nombre_emails
@profile.source<<Source.new(:email=>params[‘email_’+i.to_s])
end
if @profile.save
flash[:notice] = ‘Profile sauvé.’
redirect_to :action => ‘menu’
else
session[:nombre_emails]=0
render :action => ‘new’
end
end
dans mon _ajout_email.rhtml:

<%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %> j'espere avoir tout corrige comme il faut, desole. Merci pour ton aide

Raphael

Raph indiscret :

Ouai je vois. Normal. En fait pour tout dire je fait ce projet pour mon
boulot et j’ai changé les noms pour les mettre en français
premièrement et pour ne pas dévoiler d’informations
confidentielles.
Je vais m’appliquer cette fois ci en copiant le code et en
changeant les noms:

Email

'/>

Cette ligne a un problème. J’ai pas compris tout de suite, mais il manque
un <%= en fait.

[…]

<% render :partial => "ajout_emails" %>

Il manque un = (à moins qu’il ne relève d’informations
confidentielles).

[…]

for i in 0..nombre_emails
  @profile.source<<Source.new(:email=>params['email_'+i.to_s])

Je ne comprends toujours pas cette ligne. On a Profile
has_many :sources ? Il est où le s ?

-- Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Jean-François Trân wrote:

Raph indiscret :

Ouai je vois. Normal. En fait pour tout dire je fait ce projet pour mon
boulot et j’ai chang� les noms pour les mettre en fran�ais
premi�rement et pour ne pas d�voiler d’informations
confidentielles.
Je vais m’appliquer cette fois ci en copiant le code et en
changeant les noms:

Email

'/>

Cette ligne a un probl�me. J’ai pas compris tout de suite, mais il manque
un <%= en fait.

[…]

<% render :partial => "ajout_emails" %>

Il manque un = (� moins qu’il ne rel�ve d’informations
confidentielles).

[…]

for i in 0..nombre_emails
  @profile.source<<Source.new(:email=>params['email_'+i.to_s])

Je ne comprends toujours pas cette ligne. On a Profile
has_many :sources ? Il est o� le s ?

-- Jean-Fran�ois.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Enfin j’ai compris ton histoire de ‘s’ pour source.
et il aurait fallut un = dans le <% render… %> pour afficher le truc
ouai mais en fait je ne veux pas afficher le champ d’un nouvel email
directement donc c’etait une erreur qui m’arrangeait, Donc je pense que
ca ne sert a rien de laisser le render dans new.rhtml. Et puis le ‘%>’
était un résidu de value, la valeur par défaut que j’ai rétiré.
Donc troisième essais (merci pour ta patience):

Dans new.rhtml:

Nom
<%= text_field 'profil', 'nom' %>

Numéro de Téléphone
<%= text_area 'profil', 'telephone' %>

Email

<%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %>

Dans le controller:
def ajout_emails
session[:nombre_emails] =
session[:nombre_emails]? session[:nombre_emails]+1 : 1
@nombre_emails=session[:nombre_emails]
render :partial => “ajout_emails”
end

def new
session[:nombre_emails]=nil
end

def create
@profile = Profile.new(:title=>params[:profile][:nom],
:description=>params[:profile][:telephone]
)
nombre_emails = session[:nombre_emails]?
session[:nombre_emails].to_i : 0
0.upto(nombre_emails) do |i|
@profile.sources<<Source.new(:email=>params[‘email_’+i.to_s])
end
if @profile.save
flash[:notice] = ‘Profile sauvé.’
redirect_to :action => ‘menu’
else
session[:nombre_emails]=0
render :action => ‘new’
end
end

dans _ajout_email.rhtml:

<%=link_to_remote( "Ajouter une adresse email", :update=>"extra_emails", :url=>{:action=>"ajout_emails"}, :position => "before") %>

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs