Alleger le code

Salut,

je suis en train d’essayer de faire le ménage dans mon code

voila ce j’ai pour l’instant

def create
@vote = Vote.new
@vote.ip = request.remote_ip
@vote.faq_id = params[:faq_id]
@vote.score = params[:score]
@vote.save!
#ajoute le score au vote
score_faq params[:faq_id]
end

def score_faq id
@faq = Faq.find(id)
score_faq = 0
@faq.votes.each do |t|
score_faq += t.score
end
@faq.score = score_faq
@faq.save!
end

J’aimerais faire fusionne les deux méthodes Count permet de compter
le nombre d’élément mais pas faire le cacule des valeurs contenues
dans les élements comptés. pour l’instant j’ai bien alléger ma
méthode create.

#Créer un nouveau vote
def create
@faq = Faq.find params[:faq_id]
vote = Vote.new (:ip => request.remote_ip, :score => params
[:score])
@faq.votes << vote
#ajoute le score au vote
@vote.save!
end

a+

Bolo M. wrote :
| Salut,

Bonsoir,

Non testé, mais :

| def score_faq id
| @faq = Faq.find(id)
| score_faq = 0
| @faq.votes.each do |t|
| score_faq += t.score
| end
| @faq.score = score_faq
| @faq.save!
| end

def score_faq_id
@faq = Faq.find(id)
@faq.score = @faq.votes.inject(0) {|sum,t| sum + t }
@faq.save!
end

| #Créer un nouveau vote
| def create
| @faq = Faq.find params[:faq_id]
| vote = Vote.new (:ip => request.remote_ip, :score => params
| [:score])
| @faq.votes << vote
| #ajoute le score au vote
| @vote.save!
| end

def create
@faq = Faq.find params[:faq_id]
@faq.votes.create(:ip => request.remote_ip, :score =>
params[:score])
end

… mais comme dit plus haut: pas testé :wink:

Ce n’est pas plus tot ca ?

def create
@faq = Faq.find params[:faq_id]
@faq.votes.create(:ip => request.remote_ip, :score => params
[:score])
score_faq params[:faq_id]
end

def score_faq id
@faq = Faq.find(id)
@faq.score = @faq.votes.inject(0) {|sum,t| sum + t }
@faq.save!
end

Le 18 oct. 06 à 16:31, Frederick R. a écrit :

Frédérick:

Non testé, mais :

def score_faq_id
@faq = Faq.find(id)
@faq.score = @faq.votes.inject(0) {|sum,t| sum + t }
@faq.save!
end

voire même : faq.score = faq.votes.sum(&:score)

Mais pareil, non testé.

РJean-Fran̤ois.

Je te remercie mais depuis que je créer mon objet avec create. J’ai
deux objet créer a la fois
Le 18 oct. 06 à 15:00, Jean-François a écrit :

Alors j’ai essayé ton code je ne sais pas pourquoi mais ca me créer
deux objets à chaque fois

Le 18 oct. 06 à 16:31, Frederick R. a écrit :

J’ai testé ca
def create
@faq = Faq.find params[:faq_id]
@faq.votes << Vote.create(:ip => request.remote_ip, :score =>
params[:score])
@faq.score = faq.votes.sum(&:score)
@faq.save!
end

Le score n’est pas mis a jour il reste sur l’ancienne valeur

Le 18 oct. 06 à 15:00, Jean-François a écrit :

Bolo M. wrote :
| Alors j’ai essayé ton code je ne sais pas pourquoi mais ca me créer
| deux objets à chaque fois

Le votes.create te crée 2 objets à chaque fois ?? hummm … comprends
pas trop :frowning:

Jean-François wrote :
| voire même : faq.score = faq.votes.sum(&:score)

Joli !! en plus mon block est faux :wink: Il faut plutôt:

{|sum,t| sum + t.score}

mais je préfère ta solution :slight_smile:

C’est un problème du au plugin UJS donc la je le désactiver ce tit
soucis est résolu cependant
quand je fais ca
def create
@faq = Faq.find params[:faq_id]
@faq.votes << Vote.create(:ip => request.remote_ip, :score =>
params[:score])
@faq.score = faq.votes.sum(&:score)
@faq.save!
end

le nouveau score n’est pas pris en compte

Le 18 oct. 06 à 17:15, Frederick R. a écrit :

Bolo :

C’est un problème du au plugin UJS donc la je le désactiver
ce tit soucis est résolu cependant
quand je fais ca

Pour tester tes histoires de calcul, tu peux :

1/ soit t’exercer depuis script/console

ou/et

2/ soit vérifier que ça marche en écrivant un test unitaire.
parce que, finalement, tes histoires de calcul concernent ton
modèle Faq, donc tu peux très bien définir une méthode
calculate_score, qui, merci Ruby, merci Rails, devrait
normalement se résumer à (non testé) :

def calculate_score
score = votes.sum(&:score)
end

Avec un ptit callback judicieusement déclaré, ça
devrait te simplifier la vie et éclaircir les actions de tes
contrôleurs.

def create
@faq = Faq.find params[:faq_id]
@faq.votes << Vote.create(:ip => request.remote_ip, :score =>
params[:score])
@faq.score = faq.votes.sum(&:score)

Rails ne se plaint pas de faq à la place de @faq ?

 @faq.save!

end

le nouveau score n’est pas pris en compte

Soit tu fais :
@faq.votes << Vote.new(:ip => request.remote_ip,
:score => params[:score])

Soit tu fais :
@faq.votes.create(:ip => request.remote_ip,
:score => params[:score])
(comme te le conseillait Frédérick mais tu n’as lu sa prose
qu’à moitié)

РJean-Fran̤ois.

Je comprends pas trop

C’est deux essaies ne passe pas

@faq.score = @faq.votes.sum { |o| o.score }
@faq.votes.sum(&score)

alors que ca passe

score_faq = 0
| @faq.votes.each do |t|
| score_faq += t.score
| end
| @faq.score = score_faq

Le 18 oct. 06 à 17:15, Frederick R. a écrit :

Oui tu as raison normalement je devrais faire ca dans le model Faq.
J’ai modifié mon code en fonction de tes indications.

mon model faq
class Faq < ActiveRecord::Base
#doit avoir un id de type entier
validates_presence_of :question_fr, :reponse_fr, :faq_category_id
#se réfère a une catégories
belongs_to :faq_categories
#a bc de votes, commentaires
has_many :votes
#has_many :comments, :dependent => :destroy
#les attributs dans la recherche
acts_as_ferret

#retourne le nombre de comments non approuvés
def find_comments_unaproved
Comment.find(:all, :conditions => [“comments.approved =?”, false])
Comment.count
end

#met à jour le score de la faq
def calculate_score
 score = votes.sum(&:score)
end

end

mon model comment

class Comment < ActiveRecord::Base
#nom, email, message sont opbligaroie
validates_presence_of :nom, :message
validates_format_of :mail, :with => /^[_a-z0 -9-]+(.[_a-
z0-9-]+)@[a-z0-9-]+(.[a-z0 -9-]+)(.[a-z]{2,4})$/i
validates_length_of :nom, :within => 3…40
validates_length_of :mail, :within => 3…100
#se réfère a un commentaire
belongs_to :faq

attr_protected :approved
end

mon controller votes
def create
@faq = Faq.find params[:faq_id]
@faq.votes << Vote.new(:ip => request.remote_ip,:score =>
params[:score])
@faq.score = @faq.calculate_score
@faq.save!
end

mais malheureusement ca me retourne rien

mon model faq
class Faq < ActiveRecord::Base
#doit avoir un id de type entier
validates_presence_of :question_fr, :reponse_fr, :faq_category_id
#se réfère a une catégories
belongs_to :faq_categories

ça marche ça ? as-tu testé unitairement cette ligne de code ?

Oui les validates_presence fonctionne et belongs_to également/

Comment.count(“approved = false”)
En fait l’idée est de retournée tous les commentaires de toutes les
intances Faq qui ne sont pas approuvés.
Donc si je suis bien depuis je devrais ajouter dans mon model Comment
une nouvelle méthode unapproded qui ressemble aqqch comme ca

def nombre_unaproved
Comment.count(“approved = false”)
end

et enlever la méthode find_comments_unaproved du model Faq ?

2/ tu n’as pas testé unitairement cette méthode, avant de l’utiliser
“en contexte”
(ie dans une action)

3/ Tu devrais débugger avec script/console comme j’ai dû te le
suggérer déjà .

Pour les deux je sais honnement je comprends comment les textes
unitaires dc j’avous faire l’impasse
Personnellement pour être plus logique j’aurais fais qqch comme ça
car étant le controlleur votes je vois pas pourquoi créer une
instance faq

def create
@vote = Vote.new (:ip => request.remote_ip,:score => params
[:score], :faq_id => params[:faq_id])
@vote.faq.calculate_score
@vote.faq.save!
@vote.save!
end

Bon voila j’ai fais comme ca et ca marche
def calculate_score
self.score = self.votes.sum(‘score’)
end

def create
@vote = Vote.new (:ip => request.remote_ip,:score => params
[:score], :faq_id => params[:faq_id])
@vote.save!
@vote.faq.calculate_score
@vote.faq.save!
end

merci ce ton aide

Le 18 oct. 06 à 17:25, Jean-François a écrit :

Bolo :

Oui tu as raison normalement je devrais faire ca dans le model Faq. J’ai
modifié mon code en fonction de tes indications.

mon model faq
class Faq < ActiveRecord::Base
#doit avoir un id de type entier
validates_presence_of :question_fr, :reponse_fr, :faq_category_id
#se réfère a une catégories
belongs_to :faq_categories

ça marche ça ? as-tu testé unitairement cette ligne de code ?

end
Alors là , ces 5 lignes de code me plongent dans un puits de perplexité.

1/ Soit la ligne de commentaire est juste.
Dans ce cas là , le nom de la méthode est faux :slight_smile:
dans le code, tu ne fais rien de la collection de commentaires retournée
par Comment.find, donc cette ligne ne sert à rien si ce n’est à faire
une
requête inutile vers la BD.
La deuxième ligne est fausse car ça retourne le nombre de commentaires
dans son ensemble.

LÃ deux sous-cas,
a) le commentaire est juste, mais imprécis : “retourne le nombre de
commentaires
non approuvés pour une instance de Faq donnée”.
dans ce cas là , ce serait un truc du genre :

comments.count(“approved = false”)

Et un tit test unitaire pour vérifier que ça marche.

b) le commentaire est en fait : “retourne le nombre de commentaires
non approuvés en général”, le code serait alors

Comment.count(“approved = false”)

mais alors là , cette méthode n’a strictement rien à voir avec le modèle
Faq et n’a donc rien à faire là .

Dans tous ces cas précédents, le nom de la méthode est incorrect
et peut induire en erreur.

2/ Le commentaire est faux, la méthode porte bien son nom, on veut
récupérer une collection de commentaires. Le #count ne sert donc à rien.

a) collection pour une instance de Faq donnée, la première ligne est
donc fausse.

comments.find(:all, :conditions => [“approved = false”])

b) collection dans sa globalité. Là encore, aucun rapport avec la
choucroute
(ie Faq) et cette méthode devrait se trouver dans un autre modèle.

Dans tous les cas, c’est à corriger.

validates_presence_of :nom, :message

mon controller votes
def create
@faq = Faq.find params[:faq_id]
@faq.votes << Vote.new(:ip => request.remote_ip,:score =>
params[:score])
@faq.score = @faq.calculate_score
@faq.save!
end

mais malheureusement ca me retourne rien

Quelques pistes :

1/ tu n’utilises pas correctement #calculate_score (qui devrait
effectivement
se rebaptiser #calculate_score!

2/ tu n’as pas testé unitairement cette méthode, avant de l’utiliser
“en contexte”
(ie dans une action)

3/ Tu devrais débugger avec script/console comme j’ai dû te le suggérer
déjà .

РJean-Fran̤ois.