Nom de modèle irrégulier

Nom de modèle irrégulier - Ruby/Rails - Programmation

Marsh Posté le 09-02-2009 à 15:12:42    

Bonjour,
 
Je me retrouve avec un nom de modèle irrégulier, dont le pluriel est identique au singulier. Prenons par exemple "Anus", même si pénis aurait tout aussi bien fonctionné.
 
Un User à plusieurs Anus (c'est une appli assez incroyable), avec les relations qui vont bien. Entre autre, j'ai bien le belongs_to :user dans le modèle Anus.
 
Les routes me semblent correctes :
 

Code :
  1. map.resources :users do |users|
  2.  users.resources :anus
  3. end


 
J'ai aussi ajouté ce terme invariant dans la liste des inflexions (config/initializers/inflections.rb) :  
 

Code :
  1. ActiveSupport::Inflector.inflections do |inflect|
  2.  inflect.irregular 'anus' ,'anus'
  3. end


 
Dans le contrôleur User, j'ai un appel classique à @user.anus.all, qui devrait me lancer la liste des anus du @user, et qui à la place me gratifie d'un rageant "undefined method `anus' for #<User:0x48a5d28>"
 
Il y a autre chose à faire dans le cas de pluriels irréguliers ?
 

Reply

Marsh Posté le 09-02-2009 à 15:12:42   

Reply

Marsh Posté le 09-02-2009 à 15:58:22    

Redémarrer le serveur quand on change la config, c'est aussi une bonne idée  [:joce]  
 
Les modos peuvent locker, ça pourra toujours servir à d'autres [:dawa]

Reply

Marsh Posté le 10-02-2009 à 09:47:30    

Alors en fait non, car ce modèle me pose toujours problème.

 

Nous disons donc qu'un User peut avoir plusieurs Anus. Nested ressources, si pour un User donné je fais @user.anus.build, j'associe à @user un nouvel Anus encore non sauvegardé.

 

Pour un formulaire créant un nouvel Anus pour un utilisateur, je fais donc :

 
Code :
  1. <% form_for [@user, @new_anus] do |f| %>
 

Avec @new_anus = @user.anus.build. Et là, l'url générée donne /users/id_de_l_user/anus/id_de_l_user (au lieu de /users/id_de_l_user/anus) !

 

La même méthode fonctionnant parfaitement avec d'autres modèles, je soupçonne que la route ne soit pas créée. Crainte confirmée par une simple tentative de remplacement :

 
Code :
  1. <% form_for [@user, @new_anus], :url => anus_path(@user) do |f| %>
 

Me renvoi :

 
Code :
  1. undefined local variable or method `anus_path'
 

Alors que pourtant, dans mon routes.rb, j'ai bien :

 
Code :
  1. map.resources :users do |users|
  2.  users.resources :anus
  3. end
 

[:halp]


Message édité par LeRiton le 13-02-2009 à 16:28:30
Reply

Marsh Posté le 12-02-2009 à 11:56:02    

Code :
  1. <% form_for [@user, @new_anus], :url => user_path(@user) + "/anus" do |f| %><p>


 
[:cerveau vomi]
 
Vraiment, pas d'idées ?

Reply

Marsh Posté le 13-02-2009 à 15:49:31    

En fait ton objectif c'est quoi? Créer / updater plusieurs modèles à la fois (avec lien de parenté) dans un seul formulaire?
 
Si c'est ça alors tu t'y prends pas de la bonne manière tout simplement parce que Rails < 2.3 ne le permet pas facilement et il faut un peu bricoler (ça reste tout de même clean). Au choix: googler "rails multiple models single form" et là t'as plein de réponses (je l'ai fais pour une de mes applis), ou bien attendre Rails 2.3 (j'y réimplémenterai ma solution).
 
Et sinon c'est tout à fait normal que anus_path n'existe pas puisqu'il n'est pas définit dans tes routes.
 
EDIT: dans tes routes j'ai pas compris le users.resources :bolus, c'est une typo?


Message édité par igarimasho le 13-02-2009 à 15:56:07
Reply

Marsh Posté le 13-02-2009 à 16:49:12    

J'ai édité le post avec les routes adéquates, faute de frappe. Hormis ça, je comprend pas trop ton "pas de solution propre possible".

 

Avec des ressources nestées "classiques" (comprendre pas de pluriels tordus), j'ai pas de soucis. Si j'ai une relation 1-n entre utilisateurs et slips, ça me donne :

 
Code :
  1. map.resources :users do |user|
  2.  user.resources :slips
  3. end
 

Pour une action quelconque d'un utilisateur, si je veux y proposer la création d'un nouveau slip associé à mon utilisateur, j'ai dans le contrôleur :

 
Code :
  1. def mon_action
  2.  @user = User.mon_user
  3.  @new_slip = @user.slips.build
  4. end
 

Et dans la vue associée, je peux générer mon formulaire d'ajout d'un slip pour l'utilisateur en question avec :

 
Code :
  1. form_for [@user, @new_slip] do |f|
  2. ...
 

Et ça fonctionne parfaitement tant que j'ai pas un cas tordu comme le mien. Pour y revenir justement, le problème ne vient pas de la création du path mais plutôt d'y retrouver ses petits. Dans le cas d'anus comme invariant, anus_path peut aussi bien renvoyer à pluriel_path qu'à singulier_path (même si théoriquement, pour le dernier cas, il faut un argument, d'où mon attente sur le fait que ça fonctionne). Problème résolu par ailleurs en modifiant mes inflections, ainsi "anuses" est le pluriel d'"anus" dans mon appli.

 

Ceci dit, c'est pas vraiment d'anus dont il est question, je vous rassure...

Message cité 1 fois
Message édité par LeRiton le 13-02-2009 à 16:50:29
Reply

Marsh Posté le 13-02-2009 à 17:13:11    

LeRiton a écrit :

J'ai édité le post avec les routes adéquates, faute de frappe. Hormis ça, je comprend pas trop ton "pas de solution propre possible".


En fait c'est pour updater les slips d'un utilisateur dans un unique formulaire en même temps que les attributs du user qu'il faut ma solution de bricolo, pour créer des slips, ta solution convient.
 

LeRiton a écrit :

(même si théoriquement, pour le dernier cas, il faut un argument, d'où mon attente sur le fait que ça fonctionne).


Ouaip bizarre. T'as regardé s'il existait un bug à ce propos? En tout cas c'est l'occasion d'écrire un beau test.
 

LeRiton a écrit :

Ceci dit, c'est pas vraiment d'anus dont il est question, je vous rassure...


Ha mais y'a pas de souci, chacun son truc.

Message cité 1 fois
Message édité par igarimasho le 13-02-2009 à 17:13:31
Reply

Marsh Posté le 13-02-2009 à 17:19:26    

igarimasho a écrit :

Ouaip bizarre. T'as regardé s'il existait un bug à ce propos? En tout cas c'est l'occasion d'écrire un beau test.


 
Je comptais faire ça.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed