Validates_format_of edit/update

Bonjour

j’ai un problème avec un un message d’erreur, qui s’affiche lorsque je
crée un nouvele enregistrement, mais lorsque je l’édite et que je fait
un update rien ne s’affiche, et la valeur n’est pas modifiée.

Merci d’avance pour votre aide

ma vue d’ajout est la suivante :

<% form_tag({:action => 'add'}, {:id => 'formulaire'}) do %>
  <%= render :partial => 'form' %>

  <div id="formfooter">
    <%= submit_tag "Ajouter" %>
  </div>
<% end %>

ma vue d’édition contient le code suivant :
<% form_tag({:action => ‘edit’, :id => @contact}, {:id =>
‘formulaire’}) do %>
<%= render :partial => ‘form’ %>

  <div id="formfooter">
    <%= submit_tag "Modifier"  %>
  </div>
<% end %>

Mon formulaire est le suivant :
<%= error_messages_for ‘contact’ %>

<%= @page_title %> Créé le <%= @creation %>

Renseignements administratifs

Civilité : <%= select('contact', 'civilite', Civilite::CIVILITE_TYPES, {:prompt => "Choisir une civilite", :selected => @civilite}) %>

Nom : <%= text_field 'contact', 'nom' %>

Prénom : <%= text_field 'contact', 'prenom' %>

Adresse : <%= text_field 'contact', 'adresse' %>

Code Postal : <%= text_field 'contact', 'cp' %>

Ville : <%= text_field 'contact', 'ville' %>

Téléphone : <%= text_field 'contact', 'tel' %>

Fax : <%= text_field 'contact', 'fax' %>

GSM : <%= text_field 'contact', 'gsm' %>

Email : <%= text_field 'contact', 'email' %>

Entreprise

Entreprise : <%= check_box('contact', 'entreprise') %>

                <%= if $entreprise1 == 1
                    render :partial => "entreprise_form"
                    #render :text => "contact associé "
                    end %>
            </div>

            <%= observe_field 'contact_entreprise',
                :url=>{:action=>'check_relation_entreprise'},
                :update=>"entreprise",
                :with=>"'entreprise=' + escape(value)"
             %>
            <p><label>Code fonction : </label>    <%=

select(‘contact’, ‘codefonction’,
Fonction::FONCTION_TYPES,
{:prompt => “Choisir un code fonction”,
:selected => @codefonction}) %>
Fonction : <%= text_field ‘contact’,
‘fonction’ %>



  <div id="box-right">
     <fieldset>
        <legend>Ancien</legend>
        <p><label>Ancien : </label><%= check_box 'contact', 'ancien'

%>



<%= observe_field ‘contact_ancien’,
:url=>{:action=>‘check_ancien’},
:update=>“ancien”,
:with=>"‘ancien=’ + escape(value)"
%>



Bonjour,
Tu peux donner ton message d’erreur.

2008/6/9 Fabrice Scoubidoo.bidoo [email protected]:

bonjour

Merci de t’intéresser à mon problème.

Justement je n’ai pas de message d’erreur lorsque je fait un ajout dans
la base, et que j’ai un champ qui n’est pas correct rails me le signale
bien.

(avec une CSS)

En revanche lors de l’update du même champs (quand je l’édite pour le
modifier) rien ne se passe si je met une valeur incorrecte. il laisse
l’enregistrement tel quel et je n’ai aucun message d’erreur comme s’il
ignorait ma CSS, pas le contole du champs, car sinon il validerait même
une valeur incorrecte mais ce n’est pas le cas, il ne valide pas, mais
sort comme si il n’y avait rien eu de modifié.

j’espère que je suis clair. :stuck_out_tongue:

Merci encore

tu peux montrer ton code de validation du modèle.

2008/6/9 Fabrice Scoubidoo.bidoo [email protected]:

mais je viens de m’appercevoir d’un truc c’est que l’update du champs ne
fonctionne plus même si je met une valeur correcte :open_mouth:

vraiment bizarre ce truc

(il ne faut pas tenir compte des commentaires, j’ai simplifié au maximum
pour trouver mon problème, je garde juste le numérique pour l’instant

voilà pour le code:

class Contact < ActiveRecord::Base
#Ce code à l’air d’avoir quelques soucis à l’affiche avec la mise Ã
jour d’un des composants je pense que c’est rails qui pose problème
voila.

#Permet de rendre obligatoire les champs suivants
#validates_presence_of :civilite, :nom, :prenom, :fonction, :tel
#validates_inclusion_of :civilite, :in => Civilite::CIVILITE_TYPES.map
{ |disp, value| value}
#Permet de forcer un champs avec une valeur numérique
validates_numericality_of :cp, :promo, :tel, :fax, :gsm #,
:allow_blank => true
#validates_format_of :email, :with =>
/^([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/

def self.localized_human_attribute_name(attr)
return case attr
  when "civilite" then "Civilité"
  when "nom" then "Nom"
  when "prenom" then "Prénom"
  when "adresse" then "Adresse"
  when "cp" then "Code postal"
  when "ville" then "Ville"
  when "tel" then "Téléphone"
  when "fax" then "Fax"
  when "gsm" then "GSM"
  when "email" then "E-mail"
  when "nationalite1" then "Nationalité 1"
  else attr.humanize
end
end

end

hum pas facile,
si tu as un exemple concret de champs qui bloque, l’état du tableau
params
au moment de la mise à jour et le code de mise à jour controlleur…

tient en parlant de ca ton code pour le formulaire appel la méthode
:edit
alors qu’elle devrait appeler :update cf :
<% form_tag({:action => ‘edit’, :id => @contact}, {:id =>
‘formulaire’}) do %>
devrait être si l’on garde les conventions rails :
<% form_tag({:action => ‘update’, :id => @contact}, {:id =>
‘formulaire’}) do %>

2008/6/9 Fabrice Scoubidoo.bidoo [email protected]:

bon j’ai corrigé le edit par update (au cas où) mais rien n’y fait, en
fait je pensais que mon problème venait de mon validate mais il semble
que non

en fait il ne prend pas en compte mon update (je test au niveau du
numéro de téléphone)

le code de mon controller est le suivant :

class GestionContactController < ApplicationController

def add
@page_title = ‘Ajouter un contact’
@liste_entreprise = Entreprise.find(:all)
if $entreprise1 == nil
$entreprise_init= 0
end
if params.has_key?( :contact )
@contact = Contact.new(params[:contact])
if @contact.save
redirect_to :action => ‘list’
else
render :action => ‘add’
end
end
end

def delete
@page_title = ‘Supprimer un contact’
Contact.find(params[:id]).destroy
redirect_to :action => ‘list’
end

def update
@page_title = ‘Modifier un contact’
@contact = Contact.find(params[:id])
@creation = @contact.created_on
@entreprise = @contact.id_entreprise
if @contact.id_entreprise != nil && $entreprise1 == 0
$entreprise1 = 1
end

@civilite = @contact.civilite

if params.has_key?( :contact )
  contact_entreprise = params[:contact][:entreprise]
  if contact_entreprise == "0"
   params[:contact][:id_entreprise] = ''
  end

  @contact.update_attributes(params[:contact])
  redirect_to :action => 'list'
end

end

def index
redirect_to :action => “list”
end

def list
@page_title = ‘Liste des contacts’
@contacts = Contact.find( :all )
$entreprise1=0
$entreprise_init=0
end

def check_ancien
contact_ancien = params[:ancien]
if contact_ancien == “1”
#render :text => $entreprise1
$ancien1=1
render :partial => “ancien_form”
else
$ancien1=2
#$entreprise_init=0
render :text => ‘’
end
end

def check_relation_entreprise
contact_entreprise = params[:entreprise]
if contact_entreprise == “1”
#render :text => $entreprise1
$entreprise1=1
render :partial => “entreprise_form”
else
$entreprise1=2
#$entreprise_init=0
render :text => ‘’
end
end
end

bonjour

bein si je remplace redirect_to par render par render, j’ai un beau
message d’erreur, mais là je vois pas pourquoi, ça se met à partir en
vrille comme ça :open_mouth: tout au début ça fonctionnait bien je vois pas ce qui
a été modifié pour planter mon truc comme ça :’( :

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line #16):

13:

Téléphone
14:  
15:
16: <% @contacts.each do |contact| %>
17:
18: <%= contact.civilite %>
19: <%= contact.nom %>

Parameters:

{“commit”=>“Modifier”,
“authenticity_token”=>“8c06db071630466c53db337be8e04b62d5b3ef09”,
“contact”=>{“civilite”=>"",
“ville”=>"",
“fonction”=>"",
“nom”=>"",
“gsm”=>"",
“prenom”=>"",
“cp”=>"",
“tel”=>“22222”,
“entreprise”=>“0”,
“fax”=>"",
“adresse”=>"",
“id_entreprise”=>"",
“codefonction”=>"",
“email”=>"",
“ancien”=>“0”},
“id”=>“14”}

Remplace to redirect_to par render dans ta méthode update.

JB

On 09 Jun 2008, at 10:48, Fabrice Scoubidoo.bidoo wrote:

class GestionContactController < ApplicationController
redirect_to :action => ‘list’
end
@civilite = @contact.civilite
end
end
#$entreprise_init=0
else
$entreprise1=2
#$entreprise_init=0
render :text => ‘’
end
end
end

Posted via http://www.ruby-forum.com/.


Jean-Baptiste E.
Belighted.com | Web 2.0 Consulting & Training
Email : [email protected] | Phone: +32 486 377593

Ok merci à tous de votre aide

en fait c’était cette ligen qui foutait la zone :
@contact.update_attributes(params[:contact])

j’ai un peu modifié le code de la sorte et tout refonctionne nickel.

Merci encore

def update

@page_title = 'Modifier un contact'
@contact = Contact.find(params[:id])
@creation = @contact.created_on
@entreprise = @contact.id_entreprise
@civilite = @contact.civilite

if @contact.id_entreprise != nil && $entreprise1 == 0
   $entreprise1 = 1
end

if params.has_key?( :contact ) and 

@contact.update_attributes(params[:contact])

contact_entreprise = params[:contact][:entreprise]
if contact_entreprise == "0"
   params[:contact][:id_entreprise] = ''
   @contact.update_attributes(params[:contact])
end


  redirect_to :action => 'list'
end

end

Le 9 juin 2008 11:33, Fabrice Scoubidoo.bidoo a écrit :

Et ce code, tu comptes le garder ?

if @contact.id_entreprise != nil && $entreprise1 == 0
$entreprise1 = 1
end

– Jean-François.


http://twitter.com/underflow_

Bonjour

oui je compte bien, pourquoi ? le seul truc qui me gêne dans ce code
c’est que je me dit qu’on doit pouvoir le mettre ailleurs mais je n’ai
pas trouvé où et comment donc en l’état je le garde.

mais je suis preneur d’autres solution plus “propres”

Fabrice

Jean-François Trân wrote:

Le 9 juin 2008 11:33, Fabrice Scoubidoo.bidoo a �crit :

Et ce code, tu comptes le garder ?

if @contact.id_entreprise != nil && $entreprise1 == 0
$entreprise1 = 1
end

– Jean-Fran�ois.


http://twitter.com/underflow_

Le 9 juin 2008 17:21, Fabrice Scoubidoo.bidoo a écrit :

oui je compte bien, pourquoi ?

parce que tu le vaux bien ?

le seul truc qui me gêne dans ce code c’est que je me dit
qu’on doit pouvoir le mettre ailleurs mais je n’ai
pas trouvé où et comment donc en l’état je le garde.

mais je suis preneur d’autres solution plus “propres”

selon ton déploiement, si tu as plusieurs instances FastCGI
ou plusieurs Mongrels, Thin, etc., comment ton code marche.

– Jean-François.


http://twitter.com/underflow_

A mon avis tu devrais reprendre ton code savoir ce que tu es en train de
faire :mon code sur mon appli avec a peut près les même champ:

def update
@address_book_contact = @address_book_firm.contacts.find(params[:id])
respond_to do |format|
if
@address_book_contact.update_attributes(params[:address_book_contact])
#ici tout est ok
flash[:notice] = ‘The Contact was successfully Update.’
format.html { redirect_to_firm(@address_book_firm)}
else
#ici non
format.html { render :action => “edit”}
end
end
end

2008/6/9 Fabrice Scoubidoo.bidoo [email protected]:

Juste pour t

Le 9 juin 2008 17:30, slainer68 [at] gmail.com a écrit :

Juste pour t

Exprime-toi, slainer68.

– Jean-François.


http://twitter.com/underflow_

Jean-François Trân wrote:

Le 9 juin 2008 17:21, Fabrice Scoubidoo.bidoo a �crit :

oui je compte bien, pourquoi ?

parce que tu le vaux bien ?
Oui c’est vrai LOL

le seul truc qui me g�ne dans ce code c’est que je me dit
qu’on doit pouvoir le mettre ailleurs mais je n’ai
pas trouv� o� et comment donc en l’�tat je le garde.

mais je suis preneur d’autres solution plus “propres”

selon ton d�ploiement, si tu as plusieurs instances FastCGI
ou plusieurs Mongrels, Thin, etc., comment ton code marche.
Là je suis con où j’ai loupé un truc quel est le rapport entre les
instances ??? car en fait le code que tu m’indiques me sert uniquement Ã
afficher ou non un champs sur mon formulaire en fonction de son contenu
(si contenu il y a)

c’est lié à ça sur le _form

        <p><label>Entreprise : </label><%= check_box('contact',

‘entreprise’) %>


                <%= if $entreprise1 == 1
                    render :partial => "entreprise_form"
                    #render :text => "contact associé "
                    end %>
            </div>

            <%= observe_field 'contact_entreprise',
                :url=>{:action=>'check_relation_entreprise'},
                :update=>"entreprise",
                :with=>"'entreprise=' + escape(value)"
             %>

voilÃ

– Jean-Fran�ois.


http://twitter.com/underflow_