Undefined method `all' for Module:Class

Bonjour,

Je me trouve dans une impasse. J’obtiens le message d’erreur suivant
quand je souhaite afficher la page d’accueil de mes modules
(monserveur/modules) :

undefined method `all’ for Module:Class

J’ai utilisé le scaffold pour générer mon contrôleur module… Pour mes
autres contrôleurs, tout se passe très bien! Le code est identique.

mon modèle contient :

class Module < ActiveRecord::Base
end

mon contrôleur :

class ModulesController < ApplicationController

GET /modules

GET /modules.xml

def index
@modules = Module.all

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @modules }
end

end

GET /modules/1

GET /modules/1.xml

def show
@module = Module.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @module }
end

end

GET /modules/new

GET /modules/new.xml

def new
@module = Module.new

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @module }
end

end

GET /modules/1/edit

def edit
@module = Module.find(params[:id])
end

POST /modules

POST /modules.xml

def create
@module = Module.new(params[:module])

respond_to do |format|
  if @module.save
    flash[:notice] = 'Module was successfully created.'
    format.html { redirect_to(@module) }
    format.xml  { render :xml => @module, :status => :created,

:location => @module }
else
format.html { render :action => “new” }
format.xml { render :xml => @module.errors, :status =>
:unprocessable_entity }
end
end
end

PUT /modules/1

PUT /modules/1.xml

def update
@module = Module.find(params[:id])

respond_to do |format|
  if @module.update_attributes(params[:module])
    flash[:notice] = 'Module was successfully updated.'
    format.html { redirect_to(@module) }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @module.errors, :status =>

:unprocessable_entity }
end
end
end

DELETE /modules/1

DELETE /modules/1.xml

def destroy
@module = Module.find(params[:id])
@module.destroy

respond_to do |format|
  format.html { redirect_to(modules_url) }
  format.xml  { head :ok }
end

end
end

Lors de la génération manuelle du scaffold, j’ai bien utilisé un nom au
singulier ‘module’

Concernant les liaisons avec les autres tables dans le fichier routes,
j’ai :

map.resources :modules, :belongs_to => :autres

map.resources :autres, :has_many => :modules

je ne comprends pas pourquoi j’obtiens ce message d’erreur et seulement
sur au niveau ce contrôleur ? Surement une erreur d’inattention mais
laquelle. y a t-il quelque d’incorrect dans tout ce code ?

Déjà tes relation has_many et belogns_to il faut les mettre au niveau
de tes modèles (module et autre) et pas dans le fichier routes.

Appeller une classe module, quelle bonne idée. Je n’en vois qu’une de
meilleur, appeller un module Class ou une class Class, ou un module
Module…

Mots-clefs réservés du langage : pas touche.

Michel B.

2009/7/28 Darty B. [email protected]

He oui, parfois on découvre comme ça des mots réservés.

Moi j’avais appelé un modèle Thread, et un autre Action. Et ça, il aime
pas Rails…

Le plus ***ant de tous, c’est la colonne “type” pour un modèle quand on
utilise la STI (Single Table Inheritance)… Rails nous force plus ou
moins à écrire un controlleur différent pour chaque modèle héritant. Car
quand on veut passer le type en paramètre d’un formulaire il ne veut pas
sauver le champ “type” du modèle. Il faut alors faire un truc pas joli
pour que ça marche.

Michel B. a écrit :

Appeller une classe module, quelle bonne idée.

Je pense que la bonne idée serait surtout de générer un bon Warning,
voire-meme carrément une erreur ! C’est un peu énervant de se trouver
devant
un message aussi creux, alors que l’erreur est simplissime à prévoir.

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/

Le code source de Ruby est ouvert, si tu veux le modifier pour faire un
bon
gros warning, voir même carrément une erreur quand on fait une connerie
comme ça, c’est possible…

Michel B.

2009/7/28 Guillaume B. [email protected]

Concernant les noms des tables (modules par exemple), ce n’est pas moi
qui les choisis car je récupère ils correspondent à une interprétation
d’un autre fichier que l’on me transmet et il doit obligatoirement y
avoir une correspondance entre les noms pour la suite…

Alors bonne chance. Perso si un décideur essayait de m’imposer le nom
des
classes que j’emploie sans écouter de contre-argument quand c’est un
mot-clef réservé du langage, je demande à être changé de projet parce
que ça
va être une death march avec un clampin pareil. Il y a déjà plein de
raisons
pour lesquelles un projet peut dérailler, ça ne vaut pas le coup d’en
ajouter une complètement idiote et arbitraire.

Michel B.

Pas con. Ca me rappellera mes études et mes cours de compilateur !

gUI

Le 28 juillet 2009 12:21, Michel B.
[email protected] a
écrit :

Appeller une classe module, quelle bonne idée.
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/


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/

pareil.

considère sérieusement d’avoir des tables internes qui ne correspondent
pas
au fichier en question. bien documenté, c’est pas un soucis de
maintenance.

gUI

Le 29 juillet 2009 09:57, Michel B.
[email protected] a
écrit :

pour lesquelles un projet peut dérailler, ça ne vaut pas le coup d’en
ajouter une complètement idiote et arbitraire.

Michel B.


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/

Pour notre culture générale, une liste de mots-clés réservés en Rails
(qui varie en fonction de la base de données) :

http://wiki.rubyonrails.org/rails/pages/ReservedWords

Pour ma part, j’ai mis du temps à comprendre que je ne pouvais pas
appeler ma table “config”…


Julien Vignolles

Quand j’ai exécute la commande “route relation” => il m’a placé mes
“has_many” dans routes.rb

Concernant les noms des tables (modules par exemple), ce n’est pas moi
qui les choisis car je récupère ils correspondent à une interprétation
d’un autre fichier que l’on me transmet et il doit obligatoirement y
avoir une correspondance entre les noms pour la suite…

Et en ce qui concerne l’erreur, elle était conne mais elle est résolue.

très utile merci

Le 30 juillet 2009 14:26, Meshak [email protected] a écrit :

ben ******* wrote:

Bonjour,

Je me trouve dans une impasse. J’obtiens le message d’erreur suivant
quand je souhaite afficher la page d’accueil de mes modules
(monserveur/modules) :

undefined method `all’ for Module:Class

J’ai utilisé le scaffold pour générer mon contrôleur module… Pour mes
autres contrôleurs, tout se passe très bien! Le code est identique.

mon modèle contient :

class Module < ActiveRecord::Base
end

mon contrôleur :

class ModulesController < ApplicationController

GET /modules

GET /modules.xml

def index
@modules = Module.all

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @modules }
end

end

GET /modules/1

GET /modules/1.xml

def show
@module = Module.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @module }
end

end

GET /modules/new

GET /modules/new.xml

def new
@module = Module.new

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @module }
end

end

GET /modules/1/edit

def edit
@module = Module.find(params[:id])
end

POST /modules

POST /modules.xml

def create
@module = Module.new(params[:module])

respond_to do |format|
  if @module.save
    flash[:notice] = 'Module was successfully created.'
    format.html { redirect_to(@module) }
    format.xml  { render :xml => @module, :status => :created,

:location => @module }
else
format.html { render :action => “new” }
format.xml { render :xml => @module.errors, :status =>
:unprocessable_entity }
end
end
end

PUT /modules/1

PUT /modules/1.xml

def update
@module = Module.find(params[:id])

respond_to do |format|
  if @module.update_attributes(params[:module])
    flash[:notice] = 'Module was successfully updated.'
    format.html { redirect_to(@module) }
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @module.errors, :status =>

:unprocessable_entity }
end
end
end

DELETE /modules/1

DELETE /modules/1.xml

def destroy
@module = Module.find(params[:id])
@module.destroy

respond_to do |format|
  format.html { redirect_to(modules_url) }
  format.xml  { head :ok }
end

end
end

Lors de la génération manuelle du scaffold, j’ai bien utilisé un nom au
singulier ‘module’

Concernant les liaisons avec les autres tables dans le fichier routes,
j’ai :

map.resources :modules, :belongs_to => :autres

map.resources :autres, :has_many => :modules

je ne comprends pas pourquoi j’obtiens ce message d’erreur et seulement
sur au niveau ce contrôleur ? Surement une erreur d’inattention mais
laquelle. y a t-il quelque d’incorrect dans tout ce code ?
Salut !

Ben to fameux ‘all’ pourrait bien dépendre de ta version de RoR, pour
Rails 3 et +, pas de blem cette interface est prédéfinie je crois (info
here
#202 Active Record Queries in Rails 3 - RailsCasts),
pour rails 2.x, tu devrais créer un “named scope” (désolé, j sai po trop
traduire)comme suit:

class Module
named_scope :all, :conditions => {}

.
.
.
end

…ou bien utiliser le classique query interface “find(:all)”, après
tout l’interpreteur t’a dit qu’il ne connaît pas cette methode, donc tu
la créé to named scope, éléméntaire mon cher Watson :slight_smile:

plus d’info ici

Concernant les mots clés, ben essaie de ne pas en user :-), personnalise
to code
ex: class Module => class MyProjectNameModule (préfixe tes noms de
modèle par un nom de projet e.g., après tout, c’est transparent pour les
end-users)

Les “has_many” et “belongs-to” dans les routes, ne pas surtout confondre
avec le has_many des associations au niveau des modèles, ça s’appèlle un
“nested route” qui imbrique les sub-ressources associés à une ressource
(relation d’association définie au niveau des modèles par les
macros…“has_many” et “belongs_to” !) l’URL de cette ressource, donc
c’est pas du tout là le blem, tout est clean dans cette direction

ben je crois que ça aurra aidé bon nombre, merci