Problème de scaffold

Bonjour à tous !

Comme beaucoup je débute l’apprentissage de ruby avec le livre “Ruby on
Rails 2e édition”. Je dois avoué que je suis bloqué avec le scaffold.

J’ai vu que son utilisation avait changé entre l’écriture du livre et
l’apparition de rail 2.0. J’ai donc adapté mais ca ne fonctione toujours
pas.

Erreur affichée :
undefined method title' for #&lt;Product id: nil&gt;</code> Extracted source (around line #8): <code>5: &lt;% form_for(@product) do |f| %&gt; 6: &lt;p&gt; 7: &lt;b>Title&lt;/b>&lt;br /&gt; 8: &lt;%= f.text_field :title %&gt; 9: &lt;/p&gt; 10: 11: &lt;p&gt; </code> RAILS_ROOT: E:/C-web/Ruby/Test/depot <code>E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/attribute_methods.rb:205:inmethod_missing’
E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:562:in
send' E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:562:invalue_before_type_cast’
E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:550:in
value_before_type_cast' E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:465:into_input_field_tag’
E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:289:in
text_field' E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:640:insend’
E:/C-web/Ruby/InstantRails-2.0-win/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/form_helper.rb:640:in
text_field' app/views/products/new.html.erb:8:in_run_erb_47app47views47products47new46html46erb’
app/views/products/new.html.erb:5:in
_run_erb_47app47views47products47new46html46erb' app/controllers/products_controller.rb:29:innew’

Il me semble pourtant avoir suivi la procédure :
Test>rails -d mysql depot
depot>ruby script/generate scaffold Product title:string desc
ription:text image_url:string
depot>rake db:migrate
depot>ruby script/server webrick

Quelqu’un peut-il m’aider ? Merci.

Quelques questions déjà :

  • quelle version de rails ?
  • qu’est-ce qui se trouve dans la migration qui crée la table
    products ?
  • est-ce que tu as vérifié la table dans la base de données ?
  • comment est déclaré le modèle Product ?

Cordialement.

Michel B.

2009/11/27 Bobo B. [email protected]

Bonjour,

Moi aussi je débute avec RoR. Quand je fais un scaffold, je ne met pas
de majuscule au nom de la table.
Je met la liste des champs de ma table avec leur type : ruby script/
generate scaffold product title:string description:text
image_url:string
Puis je lance la commande. Après je vais dans db\migrate j’ouvre le
ficher généré et j’y apporte les compléments comme
“:default=>false…”.
Et enfin, je lance le rake db:migrate

Merci pestak.

Ceci dit avec une majuscule c’est censé marcher quand même, et dans le
cas
présent je crois qu’il ne voulait pas forcément apporter des compléments
Ã
la table.

Michel B.

2009/11/27 pestak [email protected]

Effectivement, majuscule ou minuscule ne change rien à la rénération du
sccafold.

Michel B. > Comme dit dasns mo prgemier post, c’est du rail 2.0

Mon fichier 001_create_products.rb donne ca :

class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.string :title
t.text :description
t.string :image_url

  t.timestamps
end

end

def self.down
drop_table :products
end
end

Et le products_controller.rb ca :

class ProductsController < ApplicationController

GET /products

GET /products.xml

def index
@products = Product.find(:all)

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

end

GET /products/1

GET /products/1.xml

def show
@product = Product.find(params[:id])

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

end

GET /products/new

GET /products/new.xml

def new
@product = Product.new

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

end

GET /products/1/edit

def edit
@product = Product.find(params[:id])
end

POST /products

POST /products.xml

def create
@product = Product.new(params[:product])

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

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

PUT /products/1

PUT /products/1.xml

def update
@product = Product.find(params[:id])

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

:unprocessable_entity }
end
end
end

DELETE /products/1

DELETE /products/1.xml

def destroy
@product = Product.find(params[:id])
@product.destroy

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

end
end

Le problème intervient à la création d’un nouveau produit. La page de
formulaire products/new.

Comment est déclaré le modèle Product ?

Je vois ca où ?

Est-ce que tu as vérifié la table dans la base de données ?

Bonne pioche ! Hormis un champ id la table est vide. Le scaffold puis le
migrate ne devait-il pas me généner les champs ? Et plus largement,
quelle est la procédure standard d’utilisation du scaffold en rails 2.0
? Il me semblait pourtant l’avoir suivi…

Il y avait 4 questions en tout :

  • répondu : quelle version de rails ?
  • répondu : qu’est-ce qui se trouve dans la migration qui crée la
    table
    products ?
  • en attente : est-ce que tu as vérifié la table dans la base de
    données
    ?
  • en attente : comment est déclaré le modèle Product ?

Cordialement.

Michel B.

2009/11/27 Bobo B. [email protected]

Bobo B. a écrit :

le rake db:migrate devrait effectivement te remplir la table
correctement. Je te conseille de drop la table et relancer la migration
pour voir si le problème persiste.

La procédure d’utilisation du scaffold est simple

  1. tu le génères
  2. tu l’enlève
  3. tu écris comme tu préfères.

Personnellement, je n’utilise les scaffold que pour me créer les
fichiers avec les bon entente.


Cyril M.

2009/11/27 Bobo B. [email protected]

Comment est déclaré le modèle Product ?

Je vois ca où ?

Dans la modèle Product (app/models/product.rb)

Est-ce que tu as vérifié la table dans la base de données ?

Bonne pioche ! Hormis un champ id la table est vide. Le scaffold puis le
migrate ne devait-il pas me généner les champs ? Et plus largement,
quelle est la procédure standard d’utilisation du scaffold en rails 2.0
? Il me semblait pourtant l’avoir suivi…

En fait à ta place je commencerais surtoout par utiliser une version de
Rails à jour, la 2.0 date quand même…

Actuellement on est passé à la 2.3.5, et il y a plein de bonnes choses
dedans.

Michel B.

Michel B. >

Changer encore de versio ne résoudra pas mon problème. Je serai même
plutôt tenté de revenir à la version 1.2 pour qu’enfin ce qui est dit
dans mon bouquin fonctionne.

Stephane de la Linuxerie >

Avec le rake db:create j’y ai cru. Mais non :frowning: Sur cette instruction
j’ai droit à un “depot_development already exists”. La table est bien
là , mais toujours sans mes champs. Et c’est toujours le cas après le
migrate.

bonjour,

voici la procédure qui marche sur mon poste :

rails -d mysql depot
cd depot
ruby script/generate scaffold Product title:string description:text
image_url:string
rake db:create (pour créer la table)
rake db:migrate

ruby script/server

Le 27 novembre 2009 08:32, Bobo B. [email protected] a
écrit :

Et si tu crée les champs a la main dans ta table ?
est - ce qu’il n’y aurait pas un problème de droit dans ta base de
données ?

il y a quelques temps j’ai fait un article sur le scaffold tu peut jeter
un coup d’oeil :

http://linuxerie.midiblogs.com/archive/2009/10/26/rails-comprendre-le-fonctionnement-de-rails-avec-le-scaffol.html

Michel B. >

Les bons trucs de la version actuelle ou les choses fun des futures
versions, je m’en moque totalement. Moi j’ai une appli à développer le
plus vite possible et j’ai acheté un bouquin pour m’y aider. Peut
importe ce que j’utilise pour développer, faut juste que l’appli tourne
le plus vite possible.

Stephane de la Linuxerie >

Effectivement, en créant les champs à la main ca fonctionne. Ouf ! Je
vais enfin pouvoir avancer. Mais par curiosité j’aimerai bien savoir
pourquoi ma base n’était pas créée correctement…

Un grand merci à vous !

Michel B. >

Changer encore de versio ne résoudra pas mon problème. Je serai même
plutôt tenté de revenir à la version 1.2 pour qu’enfin ce qui est dit
dans mon bouquin fonctionne.

C’est sûr qu’un vieux bouquin c’est rassurant, il y a des précédents
illustres (j’ai même entendu dire qu’il y a des gens qui basent leur vie
sur
des bouquins vieux de plusieurs siècles, voir millénaires…). Mais bon,
en
matière d’informatique en tout cas je ne suis pas persuadé que ce soit
l’idée la plus pertinente. Rails 1.2 maintenant c’est un peu du logiciel
“mort”, et Rails 2.0 aussi bientôt, vu qu’on va avoir une nouvelle
version
3.0 qui va beaucoup changer la donne.

En plus, tu va manquer presque tout ce qui est “fun” dans Rails en
partant
avec une philosophie comme ça, tu vas chercher à réinventer la roue Ã
chaque
coin de rue, tu ne va pas profiter des choses qui rendent la vie
vraiment
plus simple.

Sérieux, laisse deux minutes de côté le bois mort et essaye le logiciel
vivant.

Michel B.

J’ai fini par trouver comment tout générer avec un scaffold sans rien
retoucher derrière. Mais d’autres commandes ne fonctionnent pas comme
prévu.

Histoire de résoudre définitivement tous mes problèmes, comment dois-je
faire pour installer une ancienne version de rails ? Merci.

Bobo B. a écrit :

J’ai fini par trouver comment tout générer avec un scaffold sans rien
retoucher derrière. Mais d’autres commandes ne fonctionnent pas comme
prévu.

Histoire de résoudre définitivement tous mes problèmes, comment dois-je
faire pour installer une ancienne version de rails ? Merci.

gem install php


Cyril M.

bonjour,
gem install -v=la_version rails

Le 27 nov. 2009 à 16:01, Bobo B. a écrit :