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 ?
on 2009-07-28 09:51
on 2009-07-28 10:07
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.
on 2009-07-28 10:12
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 Belleville 2009/7/28 Darty Box <list-incoming@andreas-s.net>
on 2009-07-28 11:06
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 Belleville a écrit :
on 2009-07-28 11:13
> 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/
on 2009-07-28 12:22
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 Belleville 2009/7/28 Guillaume Betous <guillaume.betous@gmail.com>
on 2009-07-28 14:18
Pas con. Ca me rappellera mes études et mes cours de compilateur ! gUI Le 28 juillet 2009 12:21, Michel Belleville <michel.belleville@gmail.com> 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/
on 2009-07-29 09:44
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.
on 2009-07-29 09:59
> > 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 Belleville
on 2009-07-29 15:58
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 Belleville <michel.belleville@gmail.com> 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 Belleville > > > > -- 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 2009-07-30 14:27
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
on 2009-07-30 14:41
très utile merci Le 30 juillet 2009 14:26, Meshak <julien.vignolles@gmail.com> a écrit :
on 2010-04-20 15:18
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 http://railscasts.com/episodes/202-active-record-queries-in-rails-3), 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 :) plus d'info ici http://stackoverflow.com/questions/2607697/ruby-on-rails-named-scope-implementation 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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.