Action inaccessible par les utilisateurs

Bonjour,

Dans mon application, il y a des jeux, et pour chaque jeu un forum est
créé. Lorsque l’on supprime un jeu, bien sur, il faut également
supprimer le forum (et idem en cascade pour les topics, les messages)

Deux questions :

  • Y a-t-il un moyen que ça se fasse “automagiquement”, ou dois-je
    absolument faire l’appel à topic.destroy dans le destroy du forum (et
    en cascade pour les messages dans le destroy du topic)
  • Je ne veux pas que le créateur du jeu (seul à avoir les droits
    nécessaires à détruire son jeu) puisse supprimer le forum (par exemple
    en faisant à la main un simple appel a
    http://monsite/forum/id/delete). Comment faire pour que seule l’appli
    puisse faire ça ?

Merci !

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

On 24 May 2008, at 11:08, Guillaume B. wrote:

Deux questions :

  • Y a-t-il un moyen que ça se fasse “automagiquement”, ou dois-je
    absolument faire l’appel à topic.destroy dans le destroy du forum (et
    en cascade pour les messages dans le destroy du topic)

Utilise :dependent=>:destroy dans ton has_many.

  • Je ne veux pas que le créateur du jeu (seul à avoir les droits
    nécessaires à détruire son jeu) puisse supprimer le forum (par exemple
    en faisant à la main un simple appel a
    http://monsite/forum/id/delete). Comment faire pour que seule l’appli
    puisse faire ça ?

Je suppose que un user has_many forums.
Si c’est bien le cas, il suffit de faire
current_user.forums.find(params[:id]).destroy

Jean-Baptiste


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

Utilise :dependent=>:destroy dans ton has_many.

ok, merci, je vais essayer ça.

current_user.forums.find(params[:id]).destroy

on s’est pas compris (-;

ça, c’est pour que seul le bon utilisateur puisse détruire son forum.
ok. moi ce que je veux c’est qu’il ne puisse pas le détruire, et que
seule la destruction du jeu (qui en effet has_many forums) puisse
détruire le forum.

gUI

On 24 May 2008, at 11:27, Guillaume B. wrote:

ça, c’est pour que seul le bon utilisateur puisse détruire son forum.
ok. moi ce que je veux c’est qu’il ne puisse pas le détruire, et que
seule la destruction du jeu (qui en effet has_many forums) puisse
détruire le forum.

Alors je ne suis pas certain de comprendre ta question. Il suffit de
ne pas mettre de méthode destroy dans ton ForumsController…


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

Alors je ne suis pas certain de comprendre ta question. Il suffit de
ne pas mettre de méthode destroy dans ton ForumsController…
oui !!! tout simplement.

en utilisant :dependent=>:destroy en effet je n’ai plus besoin de
méthode destroy. donc je l’ai virée.
merci beaucoup.

sinon la piste de Cyril m’interesse aussi (sait-on jamais, pour un truc
plus costaud).

mais je croyais qu’une méthode privée n’est accessible que par l’objet
lui-meme. comment un objet game peut-il invoquer une méthode privée de
forum ?

gUI

2008/5/24 Guillaume B. [email protected]:

ça, c’est pour que seul le bon utilisateur puisse détruire son forum.
ok. moi ce que je veux c’est qu’il ne puisse pas le détruire, et que
seule la destruction du jeu (qui en effet has_many forums) puisse
détruire le forum.

Justement, en utilisant un find sur une relation has_many, l’ensemble
est
scopé sur le propriétaire de la relation. En l’occurence ici, le
current_user. Donc ici, si un utilisateur loggé tente de supprimer un
forum
qui ne lui appartient pas, cela va simplement lever l’exception
ActiveRecord::RecordNotFound, a catcher donc :wink:


http://fabien.jakimowicz.com

2008/5/24 Guillaume B. [email protected]:

ça, c’est pour que seul le bon utilisateur puisse détruire son forum.
ok. moi ce que je veux c’est qu’il ne puisse pas le détruire, et que
seule la destruction du jeu (qui en effet has_many forums) puisse
détruire le forum.

Utilise les methodes en
privé.


Cyril M.

Justement, en utilisant un find sur une relation has_many, l’ensemble
est scopé sur le propriétaire de la relation. En l’occurence ici, le
current_user. Donc ici, si un utilisateur loggé tente de supprimer un
forum qui ne lui appartient pas, cela va simplement lever l’exception
ActiveRecord::RecordNotFound, a catcher donc :wink:
j’ai très bin compris ce que tu voulais dire, ce n’est pas ce que je
recherche. je fais déjà ce que tu dis pour la destruction du jeu par
exemple : seul le propriétaire peut supprimer son propre jeu.

dans le cadre du forum, je ne veux pas qu’il le détruise, je veux qu’il
y ait obligatoirement un forum par jeu. donc la seule façon de
détruire un forum est de détruire le jeu dont elle est associée.

gUI

Le 24 mai 2008 13:06, Guillaume B. a écrit :

dans le cadre du forum, je ne veux pas qu’il le détruise, je veux qu’il
y ait obligatoirement un forum par jeu.

Je ne comprends rien. Dans un autre message, tu écris :

ok. moi ce que je veux c’est qu’il ne puisse pas le détruire, et que
seule la destruction du jeu (qui en effet has_many forums) puisse
détruire le forum.

Game has_one :forum
ou Game has_many :forums ?

Déjà si on avait une vision claire des relations entre les classes
AR::B, on pourrait partir sur de bonnes bases (c’est ce que tu
aurais dû faire dès le départ dans ton post initial, ceci dit…).

-- Jean-François, qui va regarder un peu les qualifs.


http://twitter.com/underflow_

Je ne comprends rien.

c’est game has_one forum. c’est vrai que j’ai dis has_many après, c’est
faux. après, il me semblait que le contexte était clair )-:

récapitulons (-:

mes relations sont :

a) user has_many games
b) game has_one forum

mes exigences fonctionnelles :

  1. seul le propriétaire du jeu peut détruire un jeu
  2. le propriétaire ne peut en aucun cas détruire le forum (il est créé
    automatiquement avec le jeu, et vivra autant que lui)
  3. bien sur, quand on détruit un jeu, on détruit le forum associé

pour le 1), on me l’a expliqué il y a un moment (voir les archives de
cette liste), la solution consiste chercher le jeu dans destroy par
“current_user.games.find(:game_id)” et ainsi seul le créateur peut
détruire son jeu. je l’ai bien compris.

pour le 2) et 3) la solution m’a été donnée par Jean-Baptiste : mettre
:dependent=>:destroy dans b), et ensuite supprimer la méthode destroy de
forum. ainsi, personne ne détruira le forum, pas meme le propriétaire.

donc j’ai la solution, élégante je pense, à mon pb. parfait.

seulement Cyril, toujours pour 2) et 3), parallèlement (donc sans du
tout tenir compte des propositions de Jean-Baptsite), m’a lâché un
“utilise des méthodes privées”. il me semble en effet que ce peut etre
une solution appropriée, et je demande juste qques explications : il me
semblait que les méthodes privées ne pouvaient pas être invoquées par
autre chose que par l’objet lui-meme, et donc je ne vois pas comment
dans le destroy de game je peux aller appeler le destroy forum.

merci pour les qques explications supplémentaires qui me feront clore
cette discussion (-:

gUI

Je ne comprends rien à tes specs.

désolé, je dois avoir trop de mal à m’exprimer.

gUI

Guillaume B. wrote:

Je ne comprends rien � tes specs.

d�sol�, je dois avoir trop de mal � m’exprimer.

gUI

A mon avis, le mieux reste la solution de jean-baptiste. Tu utilise un
:dependent=>:destroy
Dès que le jeu est supprimé, son forum l’est aussi mais tu n’as aucune
action pour détruire directement un forum. (sachant que dans ton
controlleur “game”, tu sais que seul le proprio d’un jeu peu supprimer
un forum)

Les fonctions privates seraient utilisées via des callbacks
(before_destroy par exemple) ou des observers

Enfin une petite question…si un utilisateur crée un jeu donc le forum
associé, puis supprime son jeu quelques mois plus tard (donc avec de
nombreux messages dans le forum) avant de recréer le meme jeu…le forum
se retrouve vide? un flag “actif” ne serait pas plus adapté (ok, ça
risque de surcharger et t’obliger de faire des purges régulières) ?

2008/5/24 Guillaume B. :

Je ne comprends rien à tes specs.

désolé, je dois avoir trop de mal à m’exprimer.

je crois qu’on peut s’en sortir en écrivant ça :

  1. seul le propriétaire du jeu peut détruire un jeu
  2. le propriétaire ne peut en aucun cas détruire directement le forum
  3. bien sur, quand on (= le propriétaire) détruit un jeu, on (= Rails)
    détruit automatiquement le forum associé

Dans ce cas, il n’y a pas l’air d’avoir de contradiction.

  1. et 2) sont gérés par ton système d’autorisation
    et 3) c’est ActiveRecord qui gère ça comme indiqué dans un message
    précédent.

    – Jean-François.


http://twitter.com/underflow_

Le 24 mai 2008 16:02, Guillaume B. a écrit :

Je ne comprends rien.

c’est game has_one forum. c’est vrai que j’ai dis has_many après, c’est
faux. après, il me semblait que le contexte était clair )-:

pas
sûr

récapitulons (-:

mes relations sont :

a) user has_many games
b) game has_one forum

ok

mes exigences fonctionnelles :

  1. seul le propriétaire du jeu peut détruire un jeu
  2. le propriétaire ne peut en aucun cas détruire le forum (il est créé
    automatiquement avec le jeu, et vivra autant que lui)
  3. bien sur, quand on détruit un jeu, on détruit le forum associé

D’après 1) et 3) quand le propriétaire détruit un jeu, il détruit
le forum associé et il est le seul à pouvoir le faire, ce qui
contredit 2).

Je ne comprends rien à tes specs.

– Jean-François.


http://twitter.com/underflow_

Les fonctions privates seraient utilisées via des callbacks
(before_destroy par exemple) ou des observers

ok, merci, je vais creuser tout ça.
meme si je suis également convaincu que c’est pas la meilleure solution,
je vais tenter de l’implémenter, juste pour l’apprendre.

Enfin une petite question…si un utilisateur crée un jeu donc le forum
associé, puis supprime son jeu quelques mois plus tard (donc avec de
nombreux messages dans le forum) avant de recréer le meme jeu…le forum
se retrouve vide?
là, c’est moi qui comprend pas ton pb (-:

si le jeu est détruit, le forum est détruit, avec tout ce qui va avec
(topics, messages)

j’ai pas précisé à quoi sert le forum : à parler de ce jeu, créé
également sur mon appli. donc si le jeu est détruit, le forum n’a plus
de raison d’etre. en tous cas c’est mon choix actuel au stade de la
maquette (peut-etre que dans un 2e temps je laisserai vivre le forum un
certain temps par exemple…)

gUI

oki, c’était simplement une question “par curiosité”, j’ai tendance a
aimer tout archiver au cas ou :wink: