Problème étrange. Probablement une histo ire de pointeurs

Salut à tous,

J’ai donc une question pour un problème qui m’énerve depuis quelques
jours.
J’ai un newsletter_controller qui contient :
def send_newsletter
news = Newsletter.find(params[:id])
news.update_attribute(‘date’,Time.now)
@liste = get_all_emails()
for mail in @liste
email = Notifier.create_mail_mailing_list_all(mail,news)
Notifier.deliver(email)
end
end

news c’est donc une newsletter que ça va chercher dans la base de
données.
mail est donc un membre de la mailinglist.

J’ai donc le model Notifier qui contient l’action mail_mailing_list_all
:

def mail_mailing_list_all(mail,news)

if mail[:language] == 'fr'
  subject = news[:subjectfr]
  subj_temp = news[:subjectfr]
  body = replace_ids(news[:textfr],mail[:id])
  contenu = replace_ids(news[:htmlfr],mail[:id])
  message = replace_ids(news[:nohtmlfr],mail[:id])
elsif mail[:language] == 'en'
  subject = news[:subjecten]
  subj_temp = news[:subjecten]
  body = replace_ids(news[:texten],mail[:id])
  contenu = replace_ids(news[:htmlen],mail[:id])
  message = replace_ids(news[:nohtmlen],mail[:id])
end


@recipients = mail[:mail]
@from = ["Newsletter UpShot <[email protected]>"]
@subject = subject
@sent_to = Time.now
@charset = "UTF-8"
@headers["X-Mailer"] = "Ruby ActionMailer"
@headers["Reply-to"] = "Newsletter UpShot <

[email protected]>"
@headers[“X-Priority”] = “3”
@headers[“Content-Transfer-Encoding”] = “8bit”

if mail[:mailtype] == 'text'
  @content_type = "text/plain"
  @body["message"] = body
  @body["hash"] = mail_hash(mail[:mail])
  @body["id"] = mail[:id]
  @body["lang"] = mail[:language]
  @body["subj"] = replace_spaces(subj_temp)

elsif mail[:mailtype] == 'html'
  @content_type = "multipart/alternative"
  part :content_type => "text/plain",
    :body => render_message("mail_mailing_list_all_plain", :message 

=>
message, :id => mail[:id], :lang => mail[:language], :hash =>
mail_hash(mail[:mail]), :subj => replace_spaces(subj_temp))

  part :content_type => "text/html",
    :body => render_message("mail_mailing_list_all_html", :contenu 

=>
contenu, :id => mail[:id], :lang => mail[:language], :hash =>
mail_hash(mail[:mail]))
end
end

Cette action va donc envoyer la newsletter, français/anglais, html/text
etc.
La fonction replace_spaces va remplacer les espaces du sujet de la
newsletter par des tirets pour créer un joli lien à mettre dans la
newsletter qui permettra aux personnes d’accéder à la newsletter online.

Le problème est que pour la première newsletter envoyée à la première
personne, tout va bien, mais ensuite il me mets des tirets dans les
sujets
des newsletter à envoyer.
Mais donc je me retrouve avec un sujet “à tirets” même dans les
news[:subjectfr] et news[:subjecten] alors qu’ils n’ont normalement
jamais
été modifiés et qu’ils sont récupérés directement depuis la bdd et
passés en
paramètre dans la boucle du controller newsletter.

Quelqu’un qui aura eut le courage de me lire jusqu’Ã la fin saurait
m’expliquer ce problème ?

Merci d’avance,

Romain

On 8/7/07, Romain Durritçague [email protected] wrote:

Notifier.create_mail_mailing_list_all(mail,news)

  contenu = replace_ids(news[:htmlen],mail[:id])
@headers["X-Mailer"] = "Ruby ActionMailer"
  @body["lang"] = mail[:language]
  part :content_type => "text/html",

newsletter par des tirets pour créer un joli lien à mettre dans la

Quelqu’un qui aura eut le courage de me lire jusqu’à la fin saurait
m’expliquer ce problème ?

Pourquoi utilises tu des [:xx] pour atteindre tes valeurs et pas des
new.subjectfr ca serait plus lisible :slight_smile:


Cyril M.

Plus lisible et plus facile.

Sinon, pour ton soucis, ça vient du fait que tu pense que ( truc =
machin )
ça fait une copie de la valeur de machin et ça la place dans trucs.

Eh bien non, si tu fais ça tu met la référence de l’objet référencé par
machin dans l’objet référencé par truc. De même, quand tu fais une
fonction
et que tu lui passe des paramètres, ces paramètres ne sont pas des
copies
des objets que tu donne, ce sont des références vers l’objet initial.

Donc quand tu fais :
:body => render_message(“mail_mailing_list_all_plain”, :message =>
message,
:id => mail[:id], :lang => mail[:language], :hash =>
mail_hash(mail[:mail]),
:subj => replace_spaces(subj_temp))

et plus précisément :
:subj => replace_spaces(subj_temp)

Tu passe l’objet résultat de la fonction replace_spaces(subj_temp).

Jusque là rien d’affolant.

Sauf si ta fonction tu l’as écrite comme ça :

def replace_spaces( subject )
subject.gsub! /\s/, ‘-’
end

Pourquoi ? Ca retourne pourtant bien subject avec les ’ ’ remplacés par
des
‘-’ ? Oui, mais ça modifie ton objet passé en référence, comme l’indique
le
‘!’ dans gsub!.

Donc, premièrement il faudrait mettre un gentil ‘!’ à ta fonction
replace_spaces (=> replace_spaces!) pour indiquer clairement qu’elle
modifie
son paramètre si tu veux la garder comme ça, ce serait plus gentil pour
aider ceux qui utiliseront ton code (toi compris) Ã se rappeller des
effets
secondaires du bidule.

Ensuite, pour résoudre ton problème, il suffit de t’assurer que tu ne
modifie pas l’original, par exemple en utilisant gsub sans ‘!’ au lieu
de
gsub!, ou encore en faisant subject_tmp = subject.clone et en
travaillant
sur subject_tmp (mais c’est moins propre que la première solution dans
le
cas que j’ai supposé).

A mon avis c’est une variation sur ce thème.

Salut et Merci à tout les 2.

En effet, je vais plutot mettre des points maintenant, c’est vrai que
c’est
plus lisible, même si le fait d’utiliser les [:xx] les faisait
apparaitre en
gros rouge dans mon éditeur donc ça sautait bien aux yeux.

Sinon merci beaucoup à toi Michel pour cette aide bien précieuse.
En effet je n’avait pas bien appréhendé la chose. J’étais sur cette
piste
mais je n’avais pas du tout .
J’ai donc modifié et ça fonctionne parfaitement.
Merci énormément.

Le 07/08/07, Michel B. [email protected] a écrit :

C’est toujours un plaisir de déplanter quelqu’un ^^